From c5498be16c6c84d7703727652af86dcc78d6abb8 Mon Sep 17 00:00:00 2001 From: Ruben Marcus Date: Mon, 24 Mar 2025 15:26:20 +0000 Subject: [PATCH 1/4] fix wallet issues --- .github/workflows/branch-release.yaml | 72 +++++++ dist/index.d.mts | 13 ++ dist/index.d.ts | 13 ++ dist/index.js | 3 + dist/index.js.map | 1 + dist/index.mjs | 3 + dist/index.mjs.map | 1 + package.json | 17 +- pnpm-lock.yaml | 276 +++++++++++--------------- src/bitte-wallet.ts | 47 +---- 10 files changed, 244 insertions(+), 202 deletions(-) create mode 100644 .github/workflows/branch-release.yaml create mode 100644 dist/index.d.mts create mode 100644 dist/index.d.ts create mode 100644 dist/index.js create mode 100644 dist/index.js.map create mode 100644 dist/index.mjs create mode 100644 dist/index.mjs.map diff --git a/.github/workflows/branch-release.yaml b/.github/workflows/branch-release.yaml new file mode 100644 index 0000000..141318c --- /dev/null +++ b/.github/workflows/branch-release.yaml @@ -0,0 +1,72 @@ +name: Branch Release + +on: + push: + branches: + - '**' + - '!main' + +jobs: + branch-release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch all history to get the latest tag + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install pnpm + uses: pnpm/action-setup@v2 + with: + version: latest + + - name: Cache pnpm modules + uses: actions/cache@v4 + with: + path: | + ~/.pnpm-store + node_modules + src/playground/node_modules + key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm- + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm run build + + - name: Set Version from Branch + run: | + BRANCH_NAME=${GITHUB_REF#refs/heads/} + BRANCH_NAME=${BRANCH_NAME//\//-} # Replace slashes with dashes + SHORT_SHA=$(git rev-parse --short HEAD) + + # Get the latest version tag and increment patch + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.0.0") + LATEST_VERSION=${LATEST_TAG#v} # Remove 'v' prefix + + # Split version into major.minor.patch + IFS='.' read -r major minor patch <<< "$LATEST_VERSION" + + # Increment patch version + patch=$((patch + 1)) + BASE_VERSION="${major}.${minor}.${patch}" + + VERSION="${BASE_VERSION}-${BRANCH_NAME}-${SHORT_SHA}" + pnpm version $VERSION --no-git-tag-version + + - name: Configure NPM Authentication + run: | + echo "@bitte-ai:registry=https://registry.npmjs.org/" > ~/.npmrc + echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" >> ~/.npmrc + + - name: Publish with npm + run: npm publish --access public --tag beta + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/dist/index.d.mts b/dist/index.d.mts new file mode 100644 index 0000000..a3007c0 --- /dev/null +++ b/dist/index.d.mts @@ -0,0 +1,13 @@ +import { WalletModuleFactory, InjectedWallet } from '@near-wallet-selector/core'; + +interface BitteWalletParams { + walletUrl?: string; + iconUrl?: string; + deprecated?: boolean; + successUrl?: string; + failureUrl?: string; +} + +declare function setupBitteWallet({ walletUrl, iconUrl, deprecated, }?: BitteWalletParams): WalletModuleFactory; + +export { setupBitteWallet }; diff --git a/dist/index.d.ts b/dist/index.d.ts new file mode 100644 index 0000000..a3007c0 --- /dev/null +++ b/dist/index.d.ts @@ -0,0 +1,13 @@ +import { WalletModuleFactory, InjectedWallet } from '@near-wallet-selector/core'; + +interface BitteWalletParams { + walletUrl?: string; + iconUrl?: string; + deprecated?: boolean; + successUrl?: string; + failureUrl?: string; +} + +declare function setupBitteWallet({ walletUrl, iconUrl, deprecated, }?: BitteWalletParams): WalletModuleFactory; + +export { setupBitteWallet }; diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..cc9468d --- /dev/null +++ b/dist/index.js @@ -0,0 +1,3 @@ +'use strict';var walletUtils=require('@near-wallet-selector/wallet-utils'),nearApiJs=require('near-api-js'),index_js=require('near-api-js/lib/utils/index.js');var j="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTUiIGhlaWdodD0iOTUiIHZpZXdCb3g9IjAgMCA5NSA5NSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xLjc3NjE3IDU5LjE4MjZMNjIuNzIyNyA2My4zMTNDNjMuMTE4NSA2My40MzA5IDYzLjQ3ODggNjMuNjQ1NiA2My43NzA4IDYzLjkzNzdDNjQuMDYyOSA2NC4yMjk3IDY0LjI3NzUgNjQuNTg5OSA2NC4zOTU0IDY0Ljk4NThMNjguNTI1OSA3OC44NTU1QzY4LjY3ODcgNzkuMzY4NiA2OC45OTMyIDc5LjgxODYgNjkuNDIyNCA4MC4xMzg3QzY5Ljg1MTYgODAuNDU4NyA3MC4zNzI3IDgwLjYzMTYgNzAuOTA4MiA4MC42MzE2QzcxLjQ0MzYgODAuNjMxNiA3MS45NjQ3IDgwLjQ1ODcgNzIuMzkzOSA4MC4xMzg3QzcyLjgyMzEgNzkuODE4NiA3My4xMzc2IDc5LjM2ODYgNzMuMjkwNCA3OC44NTU1TDc3LjQyMDkgNjQuOTg1OEM3Ny41Mzg4IDY0LjU4OTkgNzcuNzUzNCA2NC4yMjk3IDc4LjA0NTUgNjMuOTM3N0M3OC4zMzc2IDYzLjY0NTYgNzguNjk3OCA2My40MzA5IDc5LjA5MzYgNjMuMzEzTDkyLjk2MzMgNTkuMTgyNkM5My40NzY0IDU5LjAyOTcgOTMuOTI2NSA1OC43MTUzIDk0LjI0NjYgNTguMjg2MUM5NC41NjY2IDU3Ljg1NjggOTQuNzM5NSA1Ny4zMzU3IDk0LjczOTUgNTYuODAwM0M5NC43Mzk1IDU2LjI2NDkgOTQuNTY2NiA1NS43NDM4IDk0LjI0NjYgNTUuMzE0NkM5My45MjY1IDU0Ljg4NTMgOTMuNDc2NCA1NC41NzA5IDkyLjk2MzMgNTQuNDE4MUw3OS4wOTM3IDUwLjI4NzZDNzguNjk3OCA1MC4xNjk3IDc4LjMzNzYgNDkuOTU1IDc4LjA0NTUgNDkuNjYzQzc3Ljc1MzUgNDkuMzcwOSA3Ny41Mzg4IDQ5LjAxMDcgNzcuNDIwOSA0OC42MTQ4TDczLjI5MDQgMzQuNzQ1MkM3My4xMzc2IDM0LjIzMiA3Mi44MjMyIDMzLjc4MTkgNzIuMzkzOSAzMy40NjE5QzcxLjk2NDcgMzMuMTQxOSA3MS40NDM2IDMyLjk2OSA3MC45MDgyIDMyLjk2OUM3MC4zNzI4IDMyLjk2OSA2OS44NTE3IDMzLjE0MTkgNjkuNDIyNCAzMy40NjE5QzY4Ljk5MzIgMzMuNzgxOSA2OC42Nzg4IDM0LjIzMiA2OC41MjYgMzQuNzQ1Mkw2NC4zOTU0IDQ4LjYxNDhDNjQuMjc3NiA0OS4wMTA3IDY0LjA2MjkgNDkuMzcwOSA2My43NzA4IDQ5LjY2M0M2My40Nzg4IDQ5Ljk1NSA2My4xMTg1IDUwLjE2OTcgNjIuNzIyNyA1MC4yODc2TDEuNzc2MTggNTQuNDE4MUMxLjI2MzA1IDU0LjU3MDkgMC44MTI5NTYgNTQuODg1MyAwLjQ5MjkyIDU1LjMxNDZDMC4xNzI4ODQgNTUuNzQzOCAyLjI0NzU1ZS0wNiA1Ni4yNjQ5IDAgNTYuODAwM0MtMi4yNDc1MWUtMDYgNTcuMzM1NyAwLjE3Mjg4NyA1Ny44NTY4IDAuNDkyOTIgNTguMjg2MUMwLjgxMjk1MyA1OC43MTUzIDEuMjYzMDMgNTkuMDI5NyAxLjc3NjE3IDU5LjE4MjZaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMyLjE2MzcgMjkuNDg2OEw0MC4zNTc4IDMxLjkyNzFDNDAuNTkxNyAzMS45OTY3IDQwLjgwNDUgMzIuMTIzNiA0MC45NzcgMzIuMjk2MUM0MS4xNDk2IDMyLjQ2ODcgNDEuMjc2NCAzMi42ODE1IDQxLjM0NjEgMzIuOTE1NEw0My43ODYzIDQxLjEwOTVDNDMuODc2NiA0MS40MTI2IDQ0LjA2MjQgNDEuNjc4NSA0NC4zMTYgNDEuODY3NkM0NC41Njk2IDQyLjA1NjcgNDQuODc3NCA0Mi4xNTg4IDQ1LjE5MzcgNDIuMTU4OEM0NS41MTAxIDQyLjE1ODggNDUuODE3OSA0Mi4wNTY3IDQ2LjA3MTUgNDEuODY3NkM0Ni4zMjUxIDQxLjY3ODUgNDYuNTEwOSA0MS40MTI2IDQ2LjYwMTEgNDEuMTA5NUw0OS4wNDE0IDMyLjkxNTRDNDkuMTExMSAzMi42ODE1IDQ5LjIzNzkgMzIuNDY4NyA0OS40MTA0IDMyLjI5NjFDNDkuNTgzIDMyLjEyMzYgNDkuNzk1OCAzMS45OTY3IDUwLjAyOTcgMzEuOTI3MUw1OC4yMjM4IDI5LjQ4NjhDNTguNTI2OSAyOS4zOTY2IDU4Ljc5MjggMjkuMjEwOCA1OC45ODE5IDI4Ljk1NzJDNTkuMTcxIDI4LjcwMzYgNTkuMjczMSAyOC4zOTU4IDU5LjI3MzEgMjguMDc5NEM1OS4yNzMxIDI3Ljc2MzEgNTkuMTcxIDI3LjQ1NTMgNTguOTgxOSAyNy4yMDE3QzU4Ljc5MjggMjYuOTQ4MSA1OC41MjY5IDI2Ljc2MjMgNTguMjIzOCAyNi42NzJMNTAuMDI5NiAyNC4yMzE3QzQ5Ljc5NTggMjQuMTYyMSA0OS41ODI5IDI0LjAzNTIgNDkuNDEwNCAyMy44NjI3QzQ5LjIzNzkgMjMuNjkwMiA0OS4xMTEgMjMuNDc3MyA0OS4wNDE0IDIzLjI0MzRMNDYuNjAxMSAxNS4wNDkzQzQ2LjUxMDggMTQuNzQ2MiA0Ni4zMjUgMTQuNDgwMyA0Ni4wNzE1IDE0LjI5MTJDNDUuODE3OSAxNC4xMDIxIDQ1LjUxIDE0IDQ1LjE5MzcgMTRDNDQuODc3NCAxNCA0NC41Njk1IDE0LjEwMjEgNDQuMzE1OSAxNC4yOTEyQzQ0LjA2MjMgMTQuNDgwMyA0My44NzY2IDE0Ljc0NjIgNDMuNzg2MyAxNS4wNDkzTDQxLjM0NiAyMy4yNDM0QzQxLjI3NjQgMjMuNDc3MyA0MS4xNDk1IDIzLjY5MDIgNDAuOTc3IDIzLjg2MjdDNDAuODA0NCAyNC4wMzUyIDQwLjU5MTYgMjQuMTYyMSA0MC4zNTc4IDI0LjIzMTdMMzIuMTYzNyAyNi42NzJDMzEuODYwNSAyNi43NjIyIDMxLjU5NDYgMjYuOTQ4IDMxLjQwNTUgMjcuMjAxNkMzMS4yMTY0IDI3LjQ1NTIgMzEuMTE0MyAyNy43NjMxIDMxLjExNDMgMjguMDc5NEMzMS4xMTQzIDI4LjM5NTggMzEuMjE2NCAyOC43MDM3IDMxLjQwNTUgMjguOTU3MkMzMS41OTQ2IDI5LjIxMDggMzEuODYwNSAyOS4zOTY2IDMyLjE2MzcgMjkuNDg2OFoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=";var y=480,A=640,k=300,N=()=>({signedAccountId:localStorage.getItem("bitte:signedAccountId")||"",functionCallKey:JSON.parse(localStorage.getItem("bitte:functionCallKey")||"null")}),I=t=>{localStorage.setItem("bitte:signedAccountId",t.signedAccountId),localStorage.setItem("bitte:functionCallKey",JSON.stringify(t.functionCallKey));},E=(t,a)=>({walletUrl:t,network:a,provider:new nearApiJs.providers.JsonRpcProvider({url:a.nodeUrl})}),C=t=>t.signedAccountId,p=t=>{if(t.functionCallKey)return index_js.KeyPair.fromString(t.functionCallKey.privateKey).getPublicKey()},U=t=>!!t.signedAccountId,Q=()=>{let t={signedAccountId:"",functionCallKey:null};return I(t),t},d=(t,{contractId:a,methodNames:e})=>{let r=new URL(window.location.href),n=new URL(`${t.walletUrl}/login/`);n.searchParams.set("success_url",r.href),n.searchParams.set("failure_url",r.href);let i=null;if(a){n.searchParams.set("contract_id",a);let s=index_js.KeyPair.fromRandom("ed25519");n.searchParams.set("public_key",s.getPublicKey().toString()),i={privateKey:s.toString(),contractId:a,methods:e||[]};}e&&e.forEach(s=>{n.searchParams.append("methodNames",s);});let o=N();return o.functionCallKey=i,I(o),{url:n.toString(),newState:o}},f=async(t,a,{contractId:e,methodNames:r})=>{let{url:n,newState:i}=d(t,{contractId:e,methodNames:r});return D(t,n,async o=>{let s=o,{public_key:c,account_id:l}=s;if(l){let M={...i,signedAccountId:l};return I(M),[{accountId:l,publicKey:c||""}]}throw new Error("Invalid response data from wallet")})},x=async(t,{message:a,nonce:e,recipient:r,callbackUrl:n,state:i})=>{let o=n||window.location.href;if(!o)throw new Error("BitteWallet: CallbackUrl is missing");let s=new URL(t.walletUrl);return s.pathname="sign-message",s.searchParams.append("message",a),s.searchParams.append("nonce",e.toString("base64")),s.searchParams.append("recipient",r),s.searchParams.append("callbackUrl",o),i&&s.searchParams.append("state",i),D(t,s.toString(),c=>({accountId:c?.signedRequest?.accountId||"",publicKey:c?.signedRequest?.publicKey||"",signature:c?.signedRequest?.signature||""}))},h=(t,a,e)=>t.functionCallKey&&t.functionCallKey.contractId===a?e[0].type==="FunctionCall"&&e[0].params.deposit==="0"&&(t.functionCallKey.methods.length===0||t.functionCallKey.methods.includes(e[0].params.methodName)):false,W=async(t,a,{receiverId:e,actions:r})=>{let n=new nearApiJs.keyStores.InMemoryKeyStore,i=index_js.KeyPair.fromString(a.functionCallKey.privateKey);return await n.setKey(t.network.networkId,a.signedAccountId,i),(await(await nearApiJs.connect({...t.network,keyStore:n})).account(a.signedAccountId)).signAndSendTransaction({receiverId:e,actions:r.map(c=>walletUtils.createAction(c))})},Y=(t,a)=>{let e=new URL(`${t.walletUrl}/sign-transaction`),r=JSON.stringify(a,(i,o)=>typeof o=="bigint"?o.toString():o),n=encodeURIComponent(r);return e.searchParams.set("transactions_data",n),e.searchParams.set("callback_url",window.location.origin),e.toString()},z=async(t,a)=>{let e=Y(t,a),r=(await D(t,e,n=>n.transactionHashes))?.split(",");if(!r)throw new Error("No transaction hashes received");return Promise.all(r.map(n=>t.provider.txStatus(n,"unused")))},P=async(t,a,{receiverId:e,actions:r})=>{if(r.length===1&&h(a,e,r))try{return await W(t,a,{receiverId:e,actions:r})}catch(i){console.warn("Failed to sign using key pair, falling back to wallet",i);}return (await z(t,[{signerId:a.signedAccountId,receiverId:e,actions:r}]))[0]},b=async(t,a,e)=>z(t,e),K=(t,a,e,r,n)=>async o=>{let s=o.data,c=new URL(o.origin),l=new URL(t.walletUrl);if(c.origin!==l.origin){console.warn("Ignoring message from different origin",c.origin);return}switch(s.status){case "success":r?.close(),a(n(s));break;case "failure":r?.close(),e(new Error(s.errorMessage||"Transaction failed"));break;default:console.warn("Unhandled message status:",s.status);}},D=(t,a,e)=>{let r=window.innerWidth||screen.width,n=window.innerHeight||screen.height,i=(r-y)/2,o=(n-A)/2,s=window.open(a,"BitteWallet",`width=${y},height=${A},top=${o},left=${i}`);if(!s)throw new Error("Popup window blocked. Please allow popups for this site.");return new Promise((c,l)=>{let M=K(t,c,l,s,e);window.addEventListener("message",M);let g=setInterval(()=>{s.closed&&(window.removeEventListener("message",M),clearInterval(g),l(new Error("User closed the window")));},k);})},T=(t,a)=>{let e=E(t,a),r=N();return {getAccountId:()=>C(r),getPublicKey:()=>p(r),isSignedIn:()=>U(r),signOut:()=>(r=Q(),null),requestSignIn:async n=>{let i=await f(e,r,n);return r=N(),i},requestSignInUrl:n=>{let{url:i,newState:o}=d(e,n);return r=o,i},signMessage:n=>x(e,n),signAndSendTransaction:n=>P(e,r,n),signAndSendTransactions:n=>b(e,r,n)}};var w=(t,a)=>{if(a)return a;if(!t)return "https://wallet.bitte.ai";switch(t.networkId){case "mainnet":return "https://wallet.bitte.ai";case "testnet":return "https://testnet.wallet.bitte.ai";default:return "https://wallet.bitte.ai"}},v=async(t,a)=>({wallet:T(t.walletUrl,a)}),B=async({metadata:t,options:a,store:e,params:r,logger:n})=>{let i=await v(r,a.network),o=async()=>{let s=i.wallet.getAccountId(),c=i.wallet.getPublicKey();return [{accountId:s,publicKey:c?c.toString():""}]};return {async signIn({contractId:s,methodNames:c}){return i.wallet.isSignedIn()||await i.wallet.requestSignIn({contractId:s,methodNames:c}),o()},async signOut(){i.wallet.signOut();},async getAccounts(){return o()},async verifyOwner(){throw new Error(`Method not supported by ${t.name}`)},async signMessage({message:s,nonce:c,recipient:l,callbackUrl:M,state:g}){return n.log("sign message",{message:s}),await i.wallet.signMessage({message:s,nonce:c,recipient:l,callbackUrl:M,state:g})},async signAndSendTransaction({signerId:s,receiverId:c,actions:l}){n.log("signAndSendTransaction",{signerId:s,receiverId:c,actions:l});let{contract:M}=e.getState();if(!i.wallet.isSignedIn()||!M)throw new Error("Wallet not signed in");let g=i.wallet.getAccountId();if(s&&g!==s)throw new Error(`Signed in as ${g}, cannot sign for ${s}`);return i.wallet.signAndSendTransaction({receiverId:c||M.contractId,actions:l})},async signAndSendTransactions({transactions:s}){if(n.log("signAndSendTransactions",{transactions:s}),!i.wallet.isSignedIn())throw new Error("Wallet not signed in");return i.wallet.signAndSendTransactions(s)},buildImportAccountsUrl(){return `${r.walletUrl}/batch-import`}}};function Z({walletUrl:t,iconUrl:a=j,deprecated:e=false}={}){return async r=>({id:"bitte-wallet",type:"injected",metadata:{name:"Bitte Wallet",description:"NEAR wallet to store, buy, send and stake assets for DeFi.",iconUrl:a,deprecated:e,available:true,downloadUrl:w(r.options.network,t)},init:n=>B({...n,params:{walletUrl:w(r.options.network,t)}})})} +exports.setupBitteWallet=Z;//# sourceMappingURL=index.js.map +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..784485d --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/icon.ts","../src/bitte-wallet.ts","../src/bitte-wallet-setup.ts"],"names":["icon","DEFAULT_POPUP_WIDTH","DEFAULT_POPUP_HEIGHT","POLL_INTERVAL","getInitialState","saveState","state","createWalletConfig","walletUrl","network","providers","getAccountId","getPublicKey","KeyPair","isSignedIn","signOut","newState","requestSignInUrl","config","contractId","methodNames","currentUrl","newUrl","functionCallKey","accessKey","methodName","requestSignIn","url","handlePopupTransaction","data","responseData","publicKey","accountId","updatedState","signMessage","message","nonce","recipient","callbackUrl","messageState","href","value","storedKeyCanSign","receiverId","actions","signUsingKeyPair","myKeyStore","keyStores","keyPair","connect","a","createAction","requestSignTransactionsUrl","txs","stringifiedParam","_","v","urlParam","signAndSendTransactionsPopUp","txsHashes","hash","signAndSendTransaction","error","signAndSendTransactions","transactionsWS","setupMessageHandler","resolve","reject","childWindow","callback","event","origin","walletBaseUrl","screenWidth","screenHeight","left","top","messageHandler","intervalId","createBitteWalletConnector","params","result","transactions","resolveWalletUrl","setupWalletState","BitteWallet","metadata","options","store","logger","getAccounts","sgnState","signerId","contract","signedAccountId","setupBitteWallet","iconUrl","deprecated","moduleOptions"],"mappings":"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","file":"index.js","sourcesContent":["export const icon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTUiIGhlaWdodD0iOTUiIHZpZXdCb3g9IjAgMCA5NSA5NSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xLjc3NjE3IDU5LjE4MjZMNjIuNzIyNyA2My4zMTNDNjMuMTE4NSA2My40MzA5IDYzLjQ3ODggNjMuNjQ1NiA2My43NzA4IDYzLjkzNzdDNjQuMDYyOSA2NC4yMjk3IDY0LjI3NzUgNjQuNTg5OSA2NC4zOTU0IDY0Ljk4NThMNjguNTI1OSA3OC44NTU1QzY4LjY3ODcgNzkuMzY4NiA2OC45OTMyIDc5LjgxODYgNjkuNDIyNCA4MC4xMzg3QzY5Ljg1MTYgODAuNDU4NyA3MC4zNzI3IDgwLjYzMTYgNzAuOTA4MiA4MC42MzE2QzcxLjQ0MzYgODAuNjMxNiA3MS45NjQ3IDgwLjQ1ODcgNzIuMzkzOSA4MC4xMzg3QzcyLjgyMzEgNzkuODE4NiA3My4xMzc2IDc5LjM2ODYgNzMuMjkwNCA3OC44NTU1TDc3LjQyMDkgNjQuOTg1OEM3Ny41Mzg4IDY0LjU4OTkgNzcuNzUzNCA2NC4yMjk3IDc4LjA0NTUgNjMuOTM3N0M3OC4zMzc2IDYzLjY0NTYgNzguNjk3OCA2My40MzA5IDc5LjA5MzYgNjMuMzEzTDkyLjk2MzMgNTkuMTgyNkM5My40NzY0IDU5LjAyOTcgOTMuOTI2NSA1OC43MTUzIDk0LjI0NjYgNTguMjg2MUM5NC41NjY2IDU3Ljg1NjggOTQuNzM5NSA1Ny4zMzU3IDk0LjczOTUgNTYuODAwM0M5NC43Mzk1IDU2LjI2NDkgOTQuNTY2NiA1NS43NDM4IDk0LjI0NjYgNTUuMzE0NkM5My45MjY1IDU0Ljg4NTMgOTMuNDc2NCA1NC41NzA5IDkyLjk2MzMgNTQuNDE4MUw3OS4wOTM3IDUwLjI4NzZDNzguNjk3OCA1MC4xNjk3IDc4LjMzNzYgNDkuOTU1IDc4LjA0NTUgNDkuNjYzQzc3Ljc1MzUgNDkuMzcwOSA3Ny41Mzg4IDQ5LjAxMDcgNzcuNDIwOSA0OC42MTQ4TDczLjI5MDQgMzQuNzQ1MkM3My4xMzc2IDM0LjIzMiA3Mi44MjMyIDMzLjc4MTkgNzIuMzkzOSAzMy40NjE5QzcxLjk2NDcgMzMuMTQxOSA3MS40NDM2IDMyLjk2OSA3MC45MDgyIDMyLjk2OUM3MC4zNzI4IDMyLjk2OSA2OS44NTE3IDMzLjE0MTkgNjkuNDIyNCAzMy40NjE5QzY4Ljk5MzIgMzMuNzgxOSA2OC42Nzg4IDM0LjIzMiA2OC41MjYgMzQuNzQ1Mkw2NC4zOTU0IDQ4LjYxNDhDNjQuMjc3NiA0OS4wMTA3IDY0LjA2MjkgNDkuMzcwOSA2My43NzA4IDQ5LjY2M0M2My40Nzg4IDQ5Ljk1NSA2My4xMTg1IDUwLjE2OTcgNjIuNzIyNyA1MC4yODc2TDEuNzc2MTggNTQuNDE4MUMxLjI2MzA1IDU0LjU3MDkgMC44MTI5NTYgNTQuODg1MyAwLjQ5MjkyIDU1LjMxNDZDMC4xNzI4ODQgNTUuNzQzOCAyLjI0NzU1ZS0wNiA1Ni4yNjQ5IDAgNTYuODAwM0MtMi4yNDc1MWUtMDYgNTcuMzM1NyAwLjE3Mjg4NyA1Ny44NTY4IDAuNDkyOTIgNTguMjg2MUMwLjgxMjk1MyA1OC43MTUzIDEuMjYzMDMgNTkuMDI5NyAxLjc3NjE3IDU5LjE4MjZaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMyLjE2MzcgMjkuNDg2OEw0MC4zNTc4IDMxLjkyNzFDNDAuNTkxNyAzMS45OTY3IDQwLjgwNDUgMzIuMTIzNiA0MC45NzcgMzIuMjk2MUM0MS4xNDk2IDMyLjQ2ODcgNDEuMjc2NCAzMi42ODE1IDQxLjM0NjEgMzIuOTE1NEw0My43ODYzIDQxLjEwOTVDNDMuODc2NiA0MS40MTI2IDQ0LjA2MjQgNDEuNjc4NSA0NC4zMTYgNDEuODY3NkM0NC41Njk2IDQyLjA1NjcgNDQuODc3NCA0Mi4xNTg4IDQ1LjE5MzcgNDIuMTU4OEM0NS41MTAxIDQyLjE1ODggNDUuODE3OSA0Mi4wNTY3IDQ2LjA3MTUgNDEuODY3NkM0Ni4zMjUxIDQxLjY3ODUgNDYuNTEwOSA0MS40MTI2IDQ2LjYwMTEgNDEuMTA5NUw0OS4wNDE0IDMyLjkxNTRDNDkuMTExMSAzMi42ODE1IDQ5LjIzNzkgMzIuNDY4NyA0OS40MTA0IDMyLjI5NjFDNDkuNTgzIDMyLjEyMzYgNDkuNzk1OCAzMS45OTY3IDUwLjAyOTcgMzEuOTI3MUw1OC4yMjM4IDI5LjQ4NjhDNTguNTI2OSAyOS4zOTY2IDU4Ljc5MjggMjkuMjEwOCA1OC45ODE5IDI4Ljk1NzJDNTkuMTcxIDI4LjcwMzYgNTkuMjczMSAyOC4zOTU4IDU5LjI3MzEgMjguMDc5NEM1OS4yNzMxIDI3Ljc2MzEgNTkuMTcxIDI3LjQ1NTMgNTguOTgxOSAyNy4yMDE3QzU4Ljc5MjggMjYuOTQ4MSA1OC41MjY5IDI2Ljc2MjMgNTguMjIzOCAyNi42NzJMNTAuMDI5NiAyNC4yMzE3QzQ5Ljc5NTggMjQuMTYyMSA0OS41ODI5IDI0LjAzNTIgNDkuNDEwNCAyMy44NjI3QzQ5LjIzNzkgMjMuNjkwMiA0OS4xMTEgMjMuNDc3MyA0OS4wNDE0IDIzLjI0MzRMNDYuNjAxMSAxNS4wNDkzQzQ2LjUxMDggMTQuNzQ2MiA0Ni4zMjUgMTQuNDgwMyA0Ni4wNzE1IDE0LjI5MTJDNDUuODE3OSAxNC4xMDIxIDQ1LjUxIDE0IDQ1LjE5MzcgMTRDNDQuODc3NCAxNCA0NC41Njk1IDE0LjEwMjEgNDQuMzE1OSAxNC4yOTEyQzQ0LjA2MjMgMTQuNDgwMyA0My44NzY2IDE0Ljc0NjIgNDMuNzg2MyAxNS4wNDkzTDQxLjM0NiAyMy4yNDM0QzQxLjI3NjQgMjMuNDc3MyA0MS4xNDk1IDIzLjY5MDIgNDAuOTc3IDIzLjg2MjdDNDAuODA0NCAyNC4wMzUyIDQwLjU5MTYgMjQuMTYyMSA0MC4zNTc4IDI0LjIzMTdMMzIuMTYzNyAyNi42NzJDMzEuODYwNSAyNi43NjIyIDMxLjU5NDYgMjYuOTQ4IDMxLjQwNTUgMjcuMjAxNkMzMS4yMTY0IDI3LjQ1NTIgMzEuMTE0MyAyNy43NjMxIDMxLjExNDMgMjguMDc5NEMzMS4xMTQzIDI4LjM5NTggMzEuMjE2NCAyOC43MDM3IDMxLjQwNTUgMjguOTU3MkMzMS41OTQ2IDI5LjIxMDggMzEuODYwNSAyOS4zOTY2IDMyLjE2MzcgMjkuNDg2OFoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=';\n","import type {\n Action,\n FinalExecutionOutcome,\n Network,\n SignMessageParams,\n Transaction,\n} from \"@near-wallet-selector/core\";\nimport { createAction } from \"@near-wallet-selector/wallet-utils\";\nimport { connect, keyStores, providers } from \"near-api-js\";\nimport type { PublicKey } from \"near-api-js/lib/utils/index.js\";\nimport { KeyPair } from \"near-api-js/lib/utils/index.js\";\nimport { WalletConfig, WalletMessage, WalletResponseData, WalletState } from \"./types\";\n\n\n// Constants\nconst DEFAULT_POPUP_WIDTH = 480;\nconst DEFAULT_POPUP_HEIGHT = 640;\nconst POLL_INTERVAL = 300;\n\n\n// State management\nconst getInitialState = (): WalletState => ({\n signedAccountId: localStorage.getItem(\"bitte:signedAccountId\") || \"\",\n functionCallKey: JSON.parse(localStorage.getItem(\"bitte:functionCallKey\") || \"null\"),\n});\n\nconst saveState = (state: WalletState): void => {\n localStorage.setItem(\"bitte:signedAccountId\", state.signedAccountId);\n localStorage.setItem(\"bitte:functionCallKey\", JSON.stringify(state.functionCallKey));\n};\n\n// Create wallet configuration\nconst createWalletConfig = (walletUrl: string, network: Network): WalletConfig => ({\n walletUrl,\n network,\n provider: new providers.JsonRpcProvider({ url: network.nodeUrl }),\n});\n\n// Core functions\nconst getAccountId = (state: WalletState): string => {\n return state.signedAccountId;\n};\n\nconst getPublicKey = (state: WalletState): PublicKey | undefined => {\n if (state.functionCallKey) {\n return KeyPair.fromString(state.functionCallKey.privateKey as any).getPublicKey();\n }\n return undefined;\n};\n\nconst isSignedIn = (state: WalletState): boolean => {\n return !!state.signedAccountId;\n};\n\nconst signOut = (): WalletState => {\n const newState = {\n signedAccountId: \"\",\n functionCallKey: null,\n };\n saveState(newState);\n return newState;\n};\n\nconst requestSignInUrl = (\n config: WalletConfig,\n { contractId, methodNames }: { contractId: string; methodNames?: Array }\n): { url: string; newState: WalletState } => {\n const currentUrl = new URL(window.location.href);\n const newUrl = new URL(`${config.walletUrl}/login/`);\n\n newUrl.searchParams.set(\"success_url\", currentUrl.href);\n newUrl.searchParams.set(\"failure_url\", currentUrl.href);\n\n let functionCallKey = null;\n\n if (contractId) {\n newUrl.searchParams.set(\"contract_id\", contractId);\n\n const accessKey = KeyPair.fromRandom(\"ed25519\");\n newUrl.searchParams.set(\n \"public_key\",\n accessKey.getPublicKey().toString()\n );\n\n functionCallKey = {\n privateKey: accessKey.toString(),\n contractId,\n methods: methodNames || [],\n };\n }\n\n if (methodNames) {\n methodNames.forEach((methodName) => {\n newUrl.searchParams.append(\"methodNames\", methodName);\n });\n }\n\n const newState = getInitialState();\n newState.functionCallKey = functionCallKey;\n saveState(newState);\n\n return { url: newUrl.toString(), newState };\n};\n\nconst requestSignIn = async (\n config: WalletConfig,\n state: WalletState,\n { contractId, methodNames }: { contractId: string; methodNames?: Array }\n): Promise> => {\n const { url, newState } = requestSignInUrl(config, { contractId, methodNames });\n\n return handlePopupTransaction(config, url, async (data) => {\n const responseData = data as WalletResponseData;\n const { public_key: publicKey, account_id: accountId } = responseData;\n\n if (accountId) {\n const updatedState = { ...newState, signedAccountId: accountId };\n saveState(updatedState);\n return [{ accountId, publicKey: publicKey || \"\" }];\n }\n throw new Error(\"Invalid response data from wallet\");\n });\n};\n\nconst signMessage = async (\n config: WalletConfig,\n { message, nonce, recipient, callbackUrl, state: messageState }: SignMessageParams\n) => {\n const url = callbackUrl || window.location.href;\n\n if (!url) {\n throw new Error(`BitteWallet: CallbackUrl is missing`);\n }\n\n const href = new URL(config.walletUrl);\n href.pathname = \"sign-message\";\n href.searchParams.append(\"message\", message);\n href.searchParams.append(\"nonce\", nonce.toString(\"base64\"));\n href.searchParams.append(\"recipient\", recipient);\n href.searchParams.append(\"callbackUrl\", url);\n\n if (messageState) {\n href.searchParams.append(\"state\", messageState);\n }\n\n return handlePopupTransaction(config, href.toString(), (value) => {\n return {\n accountId: value?.signedRequest?.accountId || \"\",\n publicKey: value?.signedRequest?.publicKey || \"\",\n signature: value?.signedRequest?.signature || \"\",\n };\n });\n};\n\nconst storedKeyCanSign = (\n state: WalletState,\n receiverId: string,\n actions: Array\n): boolean => {\n if (\n state.functionCallKey &&\n state.functionCallKey.contractId === receiverId\n ) {\n return (\n actions[0].type === \"FunctionCall\" &&\n actions[0].params.deposit === \"0\" &&\n (state.functionCallKey.methods.length === 0 ||\n state.functionCallKey.methods.includes(actions[0].params.methodName))\n );\n }\n return false;\n};\n\nconst signUsingKeyPair = async (\n config: WalletConfig,\n state: WalletState,\n { receiverId, actions }: { receiverId: string; actions: Array }\n): Promise => {\n // instantiate an account (NEAR API is a nightmare)\n const myKeyStore = new keyStores.InMemoryKeyStore();\n const keyPair = KeyPair.fromString(state.functionCallKey!.privateKey as any);\n\n await myKeyStore.setKey(\n config.network.networkId,\n state.signedAccountId,\n keyPair\n );\n\n const near = await connect({ ...config.network, keyStore: myKeyStore });\n const account = await near.account(state.signedAccountId);\n\n return account.signAndSendTransaction({\n receiverId,\n actions: actions.map((a) => createAction(a)),\n });\n};\n\nconst requestSignTransactionsUrl = (\n config: WalletConfig,\n txs: Array\n): string => {\n const newUrl = new URL(`${config.walletUrl}/sign-transaction`);\n const stringifiedParam = JSON.stringify(txs, (_, v) => typeof v === 'bigint' ? v.toString() : v);\n const urlParam = encodeURIComponent(stringifiedParam);\n\n newUrl.searchParams.set('transactions_data', urlParam);\n newUrl.searchParams.set('callback_url', window.location.origin);\n\n return newUrl.toString();\n};\n\nconst signAndSendTransactionsPopUp = async (\n config: WalletConfig,\n txs: Array\n): Promise> => {\n const url = requestSignTransactionsUrl(config, txs);\n const txsHashes = (\n await handlePopupTransaction(config, url, (data) => data.transactionHashes)\n )?.split(\",\");\n\n if (!txsHashes) {\n throw new Error(\"No transaction hashes received\");\n }\n return Promise.all(\n txsHashes.map((hash) => config.provider.txStatus(hash, \"unused\"))\n );\n};\n\n\n\nconst signAndSendTransaction = async (\n config: WalletConfig,\n state: WalletState,\n { receiverId, actions }: { receiverId: string; actions: Array }\n): Promise => {\n if (actions.length === 1 && storedKeyCanSign(state, receiverId, actions)) {\n try {\n return await signUsingKeyPair(config, state, { receiverId, actions });\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\n \"Failed to sign using key pair, falling back to wallet\",\n error\n );\n }\n }\n\n const results = await signAndSendTransactionsPopUp(config, [{ signerId: state.signedAccountId, receiverId, actions }]);\n return results[0];\n};\n\nconst signAndSendTransactions = async (\n config: WalletConfig,\n state: WalletState,\n transactionsWS: Array\n): Promise> => {\n\n return signAndSendTransactionsPopUp(config, transactionsWS);\n};\n\n// Helper functions\nconst setupMessageHandler = (\n config: WalletConfig,\n resolve: (value: T) => void,\n reject: (reason?: unknown) => void,\n childWindow: Window | null,\n callback: (result: WalletMessage) => T\n): (event: MessageEvent) => Promise => {\n const handler = async (event: MessageEvent) => {\n const message = event.data as WalletMessage;\n\n // check if the URL are the same\n const origin = new URL(event.origin);\n const walletBaseUrl = new URL(config.walletUrl);\n\n if (origin.origin !== walletBaseUrl.origin) {\n // eslint-disable-next-line no-console\n console.warn(\"Ignoring message from different origin\", origin.origin);\n return;\n }\n\n switch (message.status) {\n case \"success\":\n childWindow?.close();\n resolve(callback(message));\n break;\n case \"failure\":\n childWindow?.close();\n reject(new Error(message.errorMessage || \"Transaction failed\"));\n break;\n default:\n // eslint-disable-next-line no-console\n console.warn(\"Unhandled message status:\", message.status);\n }\n };\n\n return handler;\n};\n\nconst handlePopupTransaction = (\n config: WalletConfig,\n url: string,\n callback: (result: WalletMessage) => T\n): Promise => {\n const screenWidth = window.innerWidth || screen.width;\n const screenHeight = window.innerHeight || screen.height;\n const left = (screenWidth - DEFAULT_POPUP_WIDTH) / 2;\n const top = (screenHeight - DEFAULT_POPUP_HEIGHT) / 2;\n\n const childWindow = window.open(\n url,\n \"BitteWallet\",\n `width=${DEFAULT_POPUP_WIDTH},height=${DEFAULT_POPUP_HEIGHT},top=${top},left=${left}`\n );\n\n if (!childWindow) {\n throw new Error(\n \"Popup window blocked. Please allow popups for this site.\"\n );\n }\n\n return new Promise((resolve, reject) => {\n const messageHandler = setupMessageHandler(\n config,\n resolve,\n reject,\n childWindow,\n callback\n );\n\n window.addEventListener(\"message\", messageHandler);\n\n const intervalId = setInterval(() => {\n if (childWindow.closed) {\n window.removeEventListener(\"message\", messageHandler);\n clearInterval(intervalId);\n reject(new Error(\"User closed the window\"));\n }\n }, POLL_INTERVAL);\n });\n};\n\n\nexport const createBitteWalletConnector = (walletUrl: string, network: Network) => {\n const config = createWalletConfig(walletUrl, network);\n let state = getInitialState();\n\n return {\n getAccountId: () => getAccountId(state),\n getPublicKey: () => getPublicKey(state),\n isSignedIn: () => isSignedIn(state),\n signOut: () => {\n state = signOut();\n return null;\n },\n requestSignIn: async (params: { contractId: string; methodNames?: Array }) => {\n const result = await requestSignIn(config, state, params);\n // Update state after sign-in\n state = getInitialState();\n return result;\n },\n requestSignInUrl: (params: { contractId: string; methodNames?: Array }) => {\n const { url, newState } = requestSignInUrl(config, params);\n state = newState;\n return url;\n },\n signMessage: (params: SignMessageParams) => signMessage(config, params),\n signAndSendTransaction: (params: { receiverId: string; actions: Array }) =>\n signAndSendTransaction(config, state, params),\n signAndSendTransactions: (transactions: Array) =>\n signAndSendTransactions(config, state, transactions),\n };\n};","import type {\n WalletModuleFactory,\n WalletBehaviourFactory,\n Transaction,\n Network,\n Account,\n InjectedWallet,\n} from \"@near-wallet-selector/core\";\nimport { icon } from \"./icon\";\nimport { createBitteWalletConnector } from \"./bitte-wallet\";\nimport { BitteWalletExtraOptions, BitteWalletParams, BitteWalletState } from \"./types\";\n\nconst resolveWalletUrl = (network?: Network, walletUrl?: string) => {\n if (walletUrl) {\n return walletUrl;\n }\n\n if(!network){\n return \"https://wallet.bitte.ai\";\n }\n\n switch (network.networkId) {\n case \"mainnet\":\n return \"https://wallet.bitte.ai\";\n case \"testnet\":\n return \"https://testnet.wallet.bitte.ai\";\n default:\n return \"https://wallet.bitte.ai\";\n }\n};\n\nconst setupWalletState = async (\n params: BitteWalletExtraOptions,\n network: Network\n): Promise => {\n // Use the factory function instead of the class constructor\n const wallet = createBitteWalletConnector(params.walletUrl, network);\n\n return {\n wallet,\n };\n};\n\nconst BitteWallet: WalletBehaviourFactory<\n InjectedWallet,\n { params: BitteWalletExtraOptions }\n> = async ({ metadata, options, store, params, logger }) => {\n const state = await setupWalletState(params, options.network);\n\n const getAccounts = async (): Promise> => {\n const accountId = state.wallet.getAccountId();\n const publicKey = state.wallet.getPublicKey();\n\n return [\n {\n accountId,\n publicKey: publicKey ? publicKey.toString() : \"\",\n },\n ];\n };\n\n return {\n async signIn({ contractId, methodNames }) {\n if (!state.wallet.isSignedIn()) {\n await state.wallet.requestSignIn({\n contractId,\n methodNames,\n });\n }\n\n return getAccounts();\n },\n\n async signOut() {\n state.wallet.signOut();\n },\n\n async getAccounts() {\n return getAccounts();\n },\n\n async verifyOwner() {\n throw new Error(`Method not supported by ${metadata.name}`);\n },\n\n async signMessage({\n message,\n nonce,\n recipient,\n callbackUrl,\n state: sgnState,\n }) {\n logger.log(\"sign message\", { message });\n\n return await state.wallet.signMessage({\n message,\n nonce,\n recipient,\n callbackUrl,\n state: sgnState,\n });\n },\n\n async signAndSendTransaction({ signerId, receiverId, actions }) {\n logger.log(\"signAndSendTransaction\", {\n signerId,\n receiverId,\n actions,\n });\n\n const { contract } = store.getState();\n\n if (!state.wallet.isSignedIn() || !contract) {\n throw new Error(\"Wallet not signed in\");\n }\n\n const signedAccountId = state.wallet.getAccountId();\n\n if (signerId && signedAccountId !== signerId) {\n throw new Error(\n `Signed in as ${signedAccountId}, cannot sign for ${signerId}`\n );\n }\n\n return state.wallet.signAndSendTransaction({\n receiverId: receiverId || contract.contractId,\n actions,\n });\n },\n\n async signAndSendTransactions({ transactions }) {\n logger.log(\"signAndSendTransactions\", { transactions });\n\n if (!state.wallet.isSignedIn()) {\n throw new Error(\"Wallet not signed in\");\n }\n\n return state.wallet.signAndSendTransactions(\n transactions as Array\n );\n },\n\n buildImportAccountsUrl() {\n return `${params.walletUrl}/batch-import`;\n },\n };\n};\n\nexport function setupBitteWallet({\n walletUrl,\n iconUrl = icon,\n deprecated = false,\n}: BitteWalletParams = {}): WalletModuleFactory {\n return async (moduleOptions) => {\n return {\n id: \"bitte-wallet\",\n type: \"injected\",\n metadata: {\n name: \"Bitte Wallet\",\n description:\n \"NEAR wallet to store, buy, send and stake assets for DeFi.\",\n iconUrl,\n deprecated,\n available: true,\n downloadUrl: resolveWalletUrl(moduleOptions.options.network, walletUrl),\n },\n init: (options) => {\n return BitteWallet({\n ...options,\n params: {\n walletUrl: resolveWalletUrl(moduleOptions.options.network, walletUrl),\n },\n });\n },\n };\n };\n}"]} \ No newline at end of file diff --git a/dist/index.mjs b/dist/index.mjs new file mode 100644 index 0000000..1f7e732 --- /dev/null +++ b/dist/index.mjs @@ -0,0 +1,3 @@ +import {createAction}from'@near-wallet-selector/wallet-utils';import {providers,keyStores,connect}from'near-api-js';import {KeyPair}from'near-api-js/lib/utils/index.js';var j="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTUiIGhlaWdodD0iOTUiIHZpZXdCb3g9IjAgMCA5NSA5NSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xLjc3NjE3IDU5LjE4MjZMNjIuNzIyNyA2My4zMTNDNjMuMTE4NSA2My40MzA5IDYzLjQ3ODggNjMuNjQ1NiA2My43NzA4IDYzLjkzNzdDNjQuMDYyOSA2NC4yMjk3IDY0LjI3NzUgNjQuNTg5OSA2NC4zOTU0IDY0Ljk4NThMNjguNTI1OSA3OC44NTU1QzY4LjY3ODcgNzkuMzY4NiA2OC45OTMyIDc5LjgxODYgNjkuNDIyNCA4MC4xMzg3QzY5Ljg1MTYgODAuNDU4NyA3MC4zNzI3IDgwLjYzMTYgNzAuOTA4MiA4MC42MzE2QzcxLjQ0MzYgODAuNjMxNiA3MS45NjQ3IDgwLjQ1ODcgNzIuMzkzOSA4MC4xMzg3QzcyLjgyMzEgNzkuODE4NiA3My4xMzc2IDc5LjM2ODYgNzMuMjkwNCA3OC44NTU1TDc3LjQyMDkgNjQuOTg1OEM3Ny41Mzg4IDY0LjU4OTkgNzcuNzUzNCA2NC4yMjk3IDc4LjA0NTUgNjMuOTM3N0M3OC4zMzc2IDYzLjY0NTYgNzguNjk3OCA2My40MzA5IDc5LjA5MzYgNjMuMzEzTDkyLjk2MzMgNTkuMTgyNkM5My40NzY0IDU5LjAyOTcgOTMuOTI2NSA1OC43MTUzIDk0LjI0NjYgNTguMjg2MUM5NC41NjY2IDU3Ljg1NjggOTQuNzM5NSA1Ny4zMzU3IDk0LjczOTUgNTYuODAwM0M5NC43Mzk1IDU2LjI2NDkgOTQuNTY2NiA1NS43NDM4IDk0LjI0NjYgNTUuMzE0NkM5My45MjY1IDU0Ljg4NTMgOTMuNDc2NCA1NC41NzA5IDkyLjk2MzMgNTQuNDE4MUw3OS4wOTM3IDUwLjI4NzZDNzguNjk3OCA1MC4xNjk3IDc4LjMzNzYgNDkuOTU1IDc4LjA0NTUgNDkuNjYzQzc3Ljc1MzUgNDkuMzcwOSA3Ny41Mzg4IDQ5LjAxMDcgNzcuNDIwOSA0OC42MTQ4TDczLjI5MDQgMzQuNzQ1MkM3My4xMzc2IDM0LjIzMiA3Mi44MjMyIDMzLjc4MTkgNzIuMzkzOSAzMy40NjE5QzcxLjk2NDcgMzMuMTQxOSA3MS40NDM2IDMyLjk2OSA3MC45MDgyIDMyLjk2OUM3MC4zNzI4IDMyLjk2OSA2OS44NTE3IDMzLjE0MTkgNjkuNDIyNCAzMy40NjE5QzY4Ljk5MzIgMzMuNzgxOSA2OC42Nzg4IDM0LjIzMiA2OC41MjYgMzQuNzQ1Mkw2NC4zOTU0IDQ4LjYxNDhDNjQuMjc3NiA0OS4wMTA3IDY0LjA2MjkgNDkuMzcwOSA2My43NzA4IDQ5LjY2M0M2My40Nzg4IDQ5Ljk1NSA2My4xMTg1IDUwLjE2OTcgNjIuNzIyNyA1MC4yODc2TDEuNzc2MTggNTQuNDE4MUMxLjI2MzA1IDU0LjU3MDkgMC44MTI5NTYgNTQuODg1MyAwLjQ5MjkyIDU1LjMxNDZDMC4xNzI4ODQgNTUuNzQzOCAyLjI0NzU1ZS0wNiA1Ni4yNjQ5IDAgNTYuODAwM0MtMi4yNDc1MWUtMDYgNTcuMzM1NyAwLjE3Mjg4NyA1Ny44NTY4IDAuNDkyOTIgNTguMjg2MUMwLjgxMjk1MyA1OC43MTUzIDEuMjYzMDMgNTkuMDI5NyAxLjc3NjE3IDU5LjE4MjZaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMyLjE2MzcgMjkuNDg2OEw0MC4zNTc4IDMxLjkyNzFDNDAuNTkxNyAzMS45OTY3IDQwLjgwNDUgMzIuMTIzNiA0MC45NzcgMzIuMjk2MUM0MS4xNDk2IDMyLjQ2ODcgNDEuMjc2NCAzMi42ODE1IDQxLjM0NjEgMzIuOTE1NEw0My43ODYzIDQxLjEwOTVDNDMuODc2NiA0MS40MTI2IDQ0LjA2MjQgNDEuNjc4NSA0NC4zMTYgNDEuODY3NkM0NC41Njk2IDQyLjA1NjcgNDQuODc3NCA0Mi4xNTg4IDQ1LjE5MzcgNDIuMTU4OEM0NS41MTAxIDQyLjE1ODggNDUuODE3OSA0Mi4wNTY3IDQ2LjA3MTUgNDEuODY3NkM0Ni4zMjUxIDQxLjY3ODUgNDYuNTEwOSA0MS40MTI2IDQ2LjYwMTEgNDEuMTA5NUw0OS4wNDE0IDMyLjkxNTRDNDkuMTExMSAzMi42ODE1IDQ5LjIzNzkgMzIuNDY4NyA0OS40MTA0IDMyLjI5NjFDNDkuNTgzIDMyLjEyMzYgNDkuNzk1OCAzMS45OTY3IDUwLjAyOTcgMzEuOTI3MUw1OC4yMjM4IDI5LjQ4NjhDNTguNTI2OSAyOS4zOTY2IDU4Ljc5MjggMjkuMjEwOCA1OC45ODE5IDI4Ljk1NzJDNTkuMTcxIDI4LjcwMzYgNTkuMjczMSAyOC4zOTU4IDU5LjI3MzEgMjguMDc5NEM1OS4yNzMxIDI3Ljc2MzEgNTkuMTcxIDI3LjQ1NTMgNTguOTgxOSAyNy4yMDE3QzU4Ljc5MjggMjYuOTQ4MSA1OC41MjY5IDI2Ljc2MjMgNTguMjIzOCAyNi42NzJMNTAuMDI5NiAyNC4yMzE3QzQ5Ljc5NTggMjQuMTYyMSA0OS41ODI5IDI0LjAzNTIgNDkuNDEwNCAyMy44NjI3QzQ5LjIzNzkgMjMuNjkwMiA0OS4xMTEgMjMuNDc3MyA0OS4wNDE0IDIzLjI0MzRMNDYuNjAxMSAxNS4wNDkzQzQ2LjUxMDggMTQuNzQ2MiA0Ni4zMjUgMTQuNDgwMyA0Ni4wNzE1IDE0LjI5MTJDNDUuODE3OSAxNC4xMDIxIDQ1LjUxIDE0IDQ1LjE5MzcgMTRDNDQuODc3NCAxNCA0NC41Njk1IDE0LjEwMjEgNDQuMzE1OSAxNC4yOTEyQzQ0LjA2MjMgMTQuNDgwMyA0My44NzY2IDE0Ljc0NjIgNDMuNzg2MyAxNS4wNDkzTDQxLjM0NiAyMy4yNDM0QzQxLjI3NjQgMjMuNDc3MyA0MS4xNDk1IDIzLjY5MDIgNDAuOTc3IDIzLjg2MjdDNDAuODA0NCAyNC4wMzUyIDQwLjU5MTYgMjQuMTYyMSA0MC4zNTc4IDI0LjIzMTdMMzIuMTYzNyAyNi42NzJDMzEuODYwNSAyNi43NjIyIDMxLjU5NDYgMjYuOTQ4IDMxLjQwNTUgMjcuMjAxNkMzMS4yMTY0IDI3LjQ1NTIgMzEuMTE0MyAyNy43NjMxIDMxLjExNDMgMjguMDc5NEMzMS4xMTQzIDI4LjM5NTggMzEuMjE2NCAyOC43MDM3IDMxLjQwNTUgMjguOTU3MkMzMS41OTQ2IDI5LjIxMDggMzEuODYwNSAyOS4zOTY2IDMyLjE2MzcgMjkuNDg2OFoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=";var y=480,A=640,k=300,N=()=>({signedAccountId:localStorage.getItem("bitte:signedAccountId")||"",functionCallKey:JSON.parse(localStorage.getItem("bitte:functionCallKey")||"null")}),I=t=>{localStorage.setItem("bitte:signedAccountId",t.signedAccountId),localStorage.setItem("bitte:functionCallKey",JSON.stringify(t.functionCallKey));},E=(t,a)=>({walletUrl:t,network:a,provider:new providers.JsonRpcProvider({url:a.nodeUrl})}),C=t=>t.signedAccountId,p=t=>{if(t.functionCallKey)return KeyPair.fromString(t.functionCallKey.privateKey).getPublicKey()},U=t=>!!t.signedAccountId,Q=()=>{let t={signedAccountId:"",functionCallKey:null};return I(t),t},d=(t,{contractId:a,methodNames:e})=>{let r=new URL(window.location.href),n=new URL(`${t.walletUrl}/login/`);n.searchParams.set("success_url",r.href),n.searchParams.set("failure_url",r.href);let i=null;if(a){n.searchParams.set("contract_id",a);let s=KeyPair.fromRandom("ed25519");n.searchParams.set("public_key",s.getPublicKey().toString()),i={privateKey:s.toString(),contractId:a,methods:e||[]};}e&&e.forEach(s=>{n.searchParams.append("methodNames",s);});let o=N();return o.functionCallKey=i,I(o),{url:n.toString(),newState:o}},f=async(t,a,{contractId:e,methodNames:r})=>{let{url:n,newState:i}=d(t,{contractId:e,methodNames:r});return D(t,n,async o=>{let s=o,{public_key:c,account_id:l}=s;if(l){let M={...i,signedAccountId:l};return I(M),[{accountId:l,publicKey:c||""}]}throw new Error("Invalid response data from wallet")})},x=async(t,{message:a,nonce:e,recipient:r,callbackUrl:n,state:i})=>{let o=n||window.location.href;if(!o)throw new Error("BitteWallet: CallbackUrl is missing");let s=new URL(t.walletUrl);return s.pathname="sign-message",s.searchParams.append("message",a),s.searchParams.append("nonce",e.toString("base64")),s.searchParams.append("recipient",r),s.searchParams.append("callbackUrl",o),i&&s.searchParams.append("state",i),D(t,s.toString(),c=>({accountId:c?.signedRequest?.accountId||"",publicKey:c?.signedRequest?.publicKey||"",signature:c?.signedRequest?.signature||""}))},h=(t,a,e)=>t.functionCallKey&&t.functionCallKey.contractId===a?e[0].type==="FunctionCall"&&e[0].params.deposit==="0"&&(t.functionCallKey.methods.length===0||t.functionCallKey.methods.includes(e[0].params.methodName)):false,W=async(t,a,{receiverId:e,actions:r})=>{let n=new keyStores.InMemoryKeyStore,i=KeyPair.fromString(a.functionCallKey.privateKey);return await n.setKey(t.network.networkId,a.signedAccountId,i),(await(await connect({...t.network,keyStore:n})).account(a.signedAccountId)).signAndSendTransaction({receiverId:e,actions:r.map(c=>createAction(c))})},Y=(t,a)=>{let e=new URL(`${t.walletUrl}/sign-transaction`),r=JSON.stringify(a,(i,o)=>typeof o=="bigint"?o.toString():o),n=encodeURIComponent(r);return e.searchParams.set("transactions_data",n),e.searchParams.set("callback_url",window.location.origin),e.toString()},z=async(t,a)=>{let e=Y(t,a),r=(await D(t,e,n=>n.transactionHashes))?.split(",");if(!r)throw new Error("No transaction hashes received");return Promise.all(r.map(n=>t.provider.txStatus(n,"unused")))},P=async(t,a,{receiverId:e,actions:r})=>{if(r.length===1&&h(a,e,r))try{return await W(t,a,{receiverId:e,actions:r})}catch(i){console.warn("Failed to sign using key pair, falling back to wallet",i);}return (await z(t,[{signerId:a.signedAccountId,receiverId:e,actions:r}]))[0]},b=async(t,a,e)=>z(t,e),K=(t,a,e,r,n)=>async o=>{let s=o.data,c=new URL(o.origin),l=new URL(t.walletUrl);if(c.origin!==l.origin){console.warn("Ignoring message from different origin",c.origin);return}switch(s.status){case "success":r?.close(),a(n(s));break;case "failure":r?.close(),e(new Error(s.errorMessage||"Transaction failed"));break;default:console.warn("Unhandled message status:",s.status);}},D=(t,a,e)=>{let r=window.innerWidth||screen.width,n=window.innerHeight||screen.height,i=(r-y)/2,o=(n-A)/2,s=window.open(a,"BitteWallet",`width=${y},height=${A},top=${o},left=${i}`);if(!s)throw new Error("Popup window blocked. Please allow popups for this site.");return new Promise((c,l)=>{let M=K(t,c,l,s,e);window.addEventListener("message",M);let g=setInterval(()=>{s.closed&&(window.removeEventListener("message",M),clearInterval(g),l(new Error("User closed the window")));},k);})},T=(t,a)=>{let e=E(t,a),r=N();return {getAccountId:()=>C(r),getPublicKey:()=>p(r),isSignedIn:()=>U(r),signOut:()=>(r=Q(),null),requestSignIn:async n=>{let i=await f(e,r,n);return r=N(),i},requestSignInUrl:n=>{let{url:i,newState:o}=d(e,n);return r=o,i},signMessage:n=>x(e,n),signAndSendTransaction:n=>P(e,r,n),signAndSendTransactions:n=>b(e,r,n)}};var w=(t,a)=>{if(a)return a;if(!t)return "https://wallet.bitte.ai";switch(t.networkId){case "mainnet":return "https://wallet.bitte.ai";case "testnet":return "https://testnet.wallet.bitte.ai";default:return "https://wallet.bitte.ai"}},v=async(t,a)=>({wallet:T(t.walletUrl,a)}),B=async({metadata:t,options:a,store:e,params:r,logger:n})=>{let i=await v(r,a.network),o=async()=>{let s=i.wallet.getAccountId(),c=i.wallet.getPublicKey();return [{accountId:s,publicKey:c?c.toString():""}]};return {async signIn({contractId:s,methodNames:c}){return i.wallet.isSignedIn()||await i.wallet.requestSignIn({contractId:s,methodNames:c}),o()},async signOut(){i.wallet.signOut();},async getAccounts(){return o()},async verifyOwner(){throw new Error(`Method not supported by ${t.name}`)},async signMessage({message:s,nonce:c,recipient:l,callbackUrl:M,state:g}){return n.log("sign message",{message:s}),await i.wallet.signMessage({message:s,nonce:c,recipient:l,callbackUrl:M,state:g})},async signAndSendTransaction({signerId:s,receiverId:c,actions:l}){n.log("signAndSendTransaction",{signerId:s,receiverId:c,actions:l});let{contract:M}=e.getState();if(!i.wallet.isSignedIn()||!M)throw new Error("Wallet not signed in");let g=i.wallet.getAccountId();if(s&&g!==s)throw new Error(`Signed in as ${g}, cannot sign for ${s}`);return i.wallet.signAndSendTransaction({receiverId:c||M.contractId,actions:l})},async signAndSendTransactions({transactions:s}){if(n.log("signAndSendTransactions",{transactions:s}),!i.wallet.isSignedIn())throw new Error("Wallet not signed in");return i.wallet.signAndSendTransactions(s)},buildImportAccountsUrl(){return `${r.walletUrl}/batch-import`}}};function Z({walletUrl:t,iconUrl:a=j,deprecated:e=false}={}){return async r=>({id:"bitte-wallet",type:"injected",metadata:{name:"Bitte Wallet",description:"NEAR wallet to store, buy, send and stake assets for DeFi.",iconUrl:a,deprecated:e,available:true,downloadUrl:w(r.options.network,t)},init:n=>B({...n,params:{walletUrl:w(r.options.network,t)}})})} +export{Z as setupBitteWallet};//# sourceMappingURL=index.mjs.map +//# sourceMappingURL=index.mjs.map \ No newline at end of file diff --git a/dist/index.mjs.map b/dist/index.mjs.map new file mode 100644 index 0000000..feba949 --- /dev/null +++ b/dist/index.mjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/icon.ts","../src/bitte-wallet.ts","../src/bitte-wallet-setup.ts"],"names":["icon","DEFAULT_POPUP_WIDTH","DEFAULT_POPUP_HEIGHT","POLL_INTERVAL","getInitialState","saveState","state","createWalletConfig","walletUrl","network","providers","getAccountId","getPublicKey","KeyPair","isSignedIn","signOut","newState","requestSignInUrl","config","contractId","methodNames","currentUrl","newUrl","functionCallKey","accessKey","methodName","requestSignIn","url","handlePopupTransaction","data","responseData","publicKey","accountId","updatedState","signMessage","message","nonce","recipient","callbackUrl","messageState","href","value","storedKeyCanSign","receiverId","actions","signUsingKeyPair","myKeyStore","keyStores","keyPair","connect","a","createAction","requestSignTransactionsUrl","txs","stringifiedParam","_","v","urlParam","signAndSendTransactionsPopUp","txsHashes","hash","signAndSendTransaction","error","signAndSendTransactions","transactionsWS","setupMessageHandler","resolve","reject","childWindow","callback","event","origin","walletBaseUrl","screenWidth","screenHeight","left","top","messageHandler","intervalId","createBitteWalletConnector","params","result","transactions","resolveWalletUrl","setupWalletState","BitteWallet","metadata","options","store","logger","getAccounts","sgnState","signerId","contract","signedAccountId","setupBitteWallet","iconUrl","deprecated","moduleOptions"],"mappings":"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","file":"index.mjs","sourcesContent":["export const icon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTUiIGhlaWdodD0iOTUiIHZpZXdCb3g9IjAgMCA5NSA5NSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xLjc3NjE3IDU5LjE4MjZMNjIuNzIyNyA2My4zMTNDNjMuMTE4NSA2My40MzA5IDYzLjQ3ODggNjMuNjQ1NiA2My43NzA4IDYzLjkzNzdDNjQuMDYyOSA2NC4yMjk3IDY0LjI3NzUgNjQuNTg5OSA2NC4zOTU0IDY0Ljk4NThMNjguNTI1OSA3OC44NTU1QzY4LjY3ODcgNzkuMzY4NiA2OC45OTMyIDc5LjgxODYgNjkuNDIyNCA4MC4xMzg3QzY5Ljg1MTYgODAuNDU4NyA3MC4zNzI3IDgwLjYzMTYgNzAuOTA4MiA4MC42MzE2QzcxLjQ0MzYgODAuNjMxNiA3MS45NjQ3IDgwLjQ1ODcgNzIuMzkzOSA4MC4xMzg3QzcyLjgyMzEgNzkuODE4NiA3My4xMzc2IDc5LjM2ODYgNzMuMjkwNCA3OC44NTU1TDc3LjQyMDkgNjQuOTg1OEM3Ny41Mzg4IDY0LjU4OTkgNzcuNzUzNCA2NC4yMjk3IDc4LjA0NTUgNjMuOTM3N0M3OC4zMzc2IDYzLjY0NTYgNzguNjk3OCA2My40MzA5IDc5LjA5MzYgNjMuMzEzTDkyLjk2MzMgNTkuMTgyNkM5My40NzY0IDU5LjAyOTcgOTMuOTI2NSA1OC43MTUzIDk0LjI0NjYgNTguMjg2MUM5NC41NjY2IDU3Ljg1NjggOTQuNzM5NSA1Ny4zMzU3IDk0LjczOTUgNTYuODAwM0M5NC43Mzk1IDU2LjI2NDkgOTQuNTY2NiA1NS43NDM4IDk0LjI0NjYgNTUuMzE0NkM5My45MjY1IDU0Ljg4NTMgOTMuNDc2NCA1NC41NzA5IDkyLjk2MzMgNTQuNDE4MUw3OS4wOTM3IDUwLjI4NzZDNzguNjk3OCA1MC4xNjk3IDc4LjMzNzYgNDkuOTU1IDc4LjA0NTUgNDkuNjYzQzc3Ljc1MzUgNDkuMzcwOSA3Ny41Mzg4IDQ5LjAxMDcgNzcuNDIwOSA0OC42MTQ4TDczLjI5MDQgMzQuNzQ1MkM3My4xMzc2IDM0LjIzMiA3Mi44MjMyIDMzLjc4MTkgNzIuMzkzOSAzMy40NjE5QzcxLjk2NDcgMzMuMTQxOSA3MS40NDM2IDMyLjk2OSA3MC45MDgyIDMyLjk2OUM3MC4zNzI4IDMyLjk2OSA2OS44NTE3IDMzLjE0MTkgNjkuNDIyNCAzMy40NjE5QzY4Ljk5MzIgMzMuNzgxOSA2OC42Nzg4IDM0LjIzMiA2OC41MjYgMzQuNzQ1Mkw2NC4zOTU0IDQ4LjYxNDhDNjQuMjc3NiA0OS4wMTA3IDY0LjA2MjkgNDkuMzcwOSA2My43NzA4IDQ5LjY2M0M2My40Nzg4IDQ5Ljk1NSA2My4xMTg1IDUwLjE2OTcgNjIuNzIyNyA1MC4yODc2TDEuNzc2MTggNTQuNDE4MUMxLjI2MzA1IDU0LjU3MDkgMC44MTI5NTYgNTQuODg1MyAwLjQ5MjkyIDU1LjMxNDZDMC4xNzI4ODQgNTUuNzQzOCAyLjI0NzU1ZS0wNiA1Ni4yNjQ5IDAgNTYuODAwM0MtMi4yNDc1MWUtMDYgNTcuMzM1NyAwLjE3Mjg4NyA1Ny44NTY4IDAuNDkyOTIgNTguMjg2MUMwLjgxMjk1MyA1OC43MTUzIDEuMjYzMDMgNTkuMDI5NyAxLjc3NjE3IDU5LjE4MjZaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMyLjE2MzcgMjkuNDg2OEw0MC4zNTc4IDMxLjkyNzFDNDAuNTkxNyAzMS45OTY3IDQwLjgwNDUgMzIuMTIzNiA0MC45NzcgMzIuMjk2MUM0MS4xNDk2IDMyLjQ2ODcgNDEuMjc2NCAzMi42ODE1IDQxLjM0NjEgMzIuOTE1NEw0My43ODYzIDQxLjEwOTVDNDMuODc2NiA0MS40MTI2IDQ0LjA2MjQgNDEuNjc4NSA0NC4zMTYgNDEuODY3NkM0NC41Njk2IDQyLjA1NjcgNDQuODc3NCA0Mi4xNTg4IDQ1LjE5MzcgNDIuMTU4OEM0NS41MTAxIDQyLjE1ODggNDUuODE3OSA0Mi4wNTY3IDQ2LjA3MTUgNDEuODY3NkM0Ni4zMjUxIDQxLjY3ODUgNDYuNTEwOSA0MS40MTI2IDQ2LjYwMTEgNDEuMTA5NUw0OS4wNDE0IDMyLjkxNTRDNDkuMTExMSAzMi42ODE1IDQ5LjIzNzkgMzIuNDY4NyA0OS40MTA0IDMyLjI5NjFDNDkuNTgzIDMyLjEyMzYgNDkuNzk1OCAzMS45OTY3IDUwLjAyOTcgMzEuOTI3MUw1OC4yMjM4IDI5LjQ4NjhDNTguNTI2OSAyOS4zOTY2IDU4Ljc5MjggMjkuMjEwOCA1OC45ODE5IDI4Ljk1NzJDNTkuMTcxIDI4LjcwMzYgNTkuMjczMSAyOC4zOTU4IDU5LjI3MzEgMjguMDc5NEM1OS4yNzMxIDI3Ljc2MzEgNTkuMTcxIDI3LjQ1NTMgNTguOTgxOSAyNy4yMDE3QzU4Ljc5MjggMjYuOTQ4MSA1OC41MjY5IDI2Ljc2MjMgNTguMjIzOCAyNi42NzJMNTAuMDI5NiAyNC4yMzE3QzQ5Ljc5NTggMjQuMTYyMSA0OS41ODI5IDI0LjAzNTIgNDkuNDEwNCAyMy44NjI3QzQ5LjIzNzkgMjMuNjkwMiA0OS4xMTEgMjMuNDc3MyA0OS4wNDE0IDIzLjI0MzRMNDYuNjAxMSAxNS4wNDkzQzQ2LjUxMDggMTQuNzQ2MiA0Ni4zMjUgMTQuNDgwMyA0Ni4wNzE1IDE0LjI5MTJDNDUuODE3OSAxNC4xMDIxIDQ1LjUxIDE0IDQ1LjE5MzcgMTRDNDQuODc3NCAxNCA0NC41Njk1IDE0LjEwMjEgNDQuMzE1OSAxNC4yOTEyQzQ0LjA2MjMgMTQuNDgwMyA0My44NzY2IDE0Ljc0NjIgNDMuNzg2MyAxNS4wNDkzTDQxLjM0NiAyMy4yNDM0QzQxLjI3NjQgMjMuNDc3MyA0MS4xNDk1IDIzLjY5MDIgNDAuOTc3IDIzLjg2MjdDNDAuODA0NCAyNC4wMzUyIDQwLjU5MTYgMjQuMTYyMSA0MC4zNTc4IDI0LjIzMTdMMzIuMTYzNyAyNi42NzJDMzEuODYwNSAyNi43NjIyIDMxLjU5NDYgMjYuOTQ4IDMxLjQwNTUgMjcuMjAxNkMzMS4yMTY0IDI3LjQ1NTIgMzEuMTE0MyAyNy43NjMxIDMxLjExNDMgMjguMDc5NEMzMS4xMTQzIDI4LjM5NTggMzEuMjE2NCAyOC43MDM3IDMxLjQwNTUgMjguOTU3MkMzMS41OTQ2IDI5LjIxMDggMzEuODYwNSAyOS4zOTY2IDMyLjE2MzcgMjkuNDg2OFoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=';\n","import type {\n Action,\n FinalExecutionOutcome,\n Network,\n SignMessageParams,\n Transaction,\n} from \"@near-wallet-selector/core\";\nimport { createAction } from \"@near-wallet-selector/wallet-utils\";\nimport { connect, keyStores, providers } from \"near-api-js\";\nimport type { PublicKey } from \"near-api-js/lib/utils/index.js\";\nimport { KeyPair } from \"near-api-js/lib/utils/index.js\";\nimport { WalletConfig, WalletMessage, WalletResponseData, WalletState } from \"./types\";\n\n\n// Constants\nconst DEFAULT_POPUP_WIDTH = 480;\nconst DEFAULT_POPUP_HEIGHT = 640;\nconst POLL_INTERVAL = 300;\n\n\n// State management\nconst getInitialState = (): WalletState => ({\n signedAccountId: localStorage.getItem(\"bitte:signedAccountId\") || \"\",\n functionCallKey: JSON.parse(localStorage.getItem(\"bitte:functionCallKey\") || \"null\"),\n});\n\nconst saveState = (state: WalletState): void => {\n localStorage.setItem(\"bitte:signedAccountId\", state.signedAccountId);\n localStorage.setItem(\"bitte:functionCallKey\", JSON.stringify(state.functionCallKey));\n};\n\n// Create wallet configuration\nconst createWalletConfig = (walletUrl: string, network: Network): WalletConfig => ({\n walletUrl,\n network,\n provider: new providers.JsonRpcProvider({ url: network.nodeUrl }),\n});\n\n// Core functions\nconst getAccountId = (state: WalletState): string => {\n return state.signedAccountId;\n};\n\nconst getPublicKey = (state: WalletState): PublicKey | undefined => {\n if (state.functionCallKey) {\n return KeyPair.fromString(state.functionCallKey.privateKey as any).getPublicKey();\n }\n return undefined;\n};\n\nconst isSignedIn = (state: WalletState): boolean => {\n return !!state.signedAccountId;\n};\n\nconst signOut = (): WalletState => {\n const newState = {\n signedAccountId: \"\",\n functionCallKey: null,\n };\n saveState(newState);\n return newState;\n};\n\nconst requestSignInUrl = (\n config: WalletConfig,\n { contractId, methodNames }: { contractId: string; methodNames?: Array }\n): { url: string; newState: WalletState } => {\n const currentUrl = new URL(window.location.href);\n const newUrl = new URL(`${config.walletUrl}/login/`);\n\n newUrl.searchParams.set(\"success_url\", currentUrl.href);\n newUrl.searchParams.set(\"failure_url\", currentUrl.href);\n\n let functionCallKey = null;\n\n if (contractId) {\n newUrl.searchParams.set(\"contract_id\", contractId);\n\n const accessKey = KeyPair.fromRandom(\"ed25519\");\n newUrl.searchParams.set(\n \"public_key\",\n accessKey.getPublicKey().toString()\n );\n\n functionCallKey = {\n privateKey: accessKey.toString(),\n contractId,\n methods: methodNames || [],\n };\n }\n\n if (methodNames) {\n methodNames.forEach((methodName) => {\n newUrl.searchParams.append(\"methodNames\", methodName);\n });\n }\n\n const newState = getInitialState();\n newState.functionCallKey = functionCallKey;\n saveState(newState);\n\n return { url: newUrl.toString(), newState };\n};\n\nconst requestSignIn = async (\n config: WalletConfig,\n state: WalletState,\n { contractId, methodNames }: { contractId: string; methodNames?: Array }\n): Promise> => {\n const { url, newState } = requestSignInUrl(config, { contractId, methodNames });\n\n return handlePopupTransaction(config, url, async (data) => {\n const responseData = data as WalletResponseData;\n const { public_key: publicKey, account_id: accountId } = responseData;\n\n if (accountId) {\n const updatedState = { ...newState, signedAccountId: accountId };\n saveState(updatedState);\n return [{ accountId, publicKey: publicKey || \"\" }];\n }\n throw new Error(\"Invalid response data from wallet\");\n });\n};\n\nconst signMessage = async (\n config: WalletConfig,\n { message, nonce, recipient, callbackUrl, state: messageState }: SignMessageParams\n) => {\n const url = callbackUrl || window.location.href;\n\n if (!url) {\n throw new Error(`BitteWallet: CallbackUrl is missing`);\n }\n\n const href = new URL(config.walletUrl);\n href.pathname = \"sign-message\";\n href.searchParams.append(\"message\", message);\n href.searchParams.append(\"nonce\", nonce.toString(\"base64\"));\n href.searchParams.append(\"recipient\", recipient);\n href.searchParams.append(\"callbackUrl\", url);\n\n if (messageState) {\n href.searchParams.append(\"state\", messageState);\n }\n\n return handlePopupTransaction(config, href.toString(), (value) => {\n return {\n accountId: value?.signedRequest?.accountId || \"\",\n publicKey: value?.signedRequest?.publicKey || \"\",\n signature: value?.signedRequest?.signature || \"\",\n };\n });\n};\n\nconst storedKeyCanSign = (\n state: WalletState,\n receiverId: string,\n actions: Array\n): boolean => {\n if (\n state.functionCallKey &&\n state.functionCallKey.contractId === receiverId\n ) {\n return (\n actions[0].type === \"FunctionCall\" &&\n actions[0].params.deposit === \"0\" &&\n (state.functionCallKey.methods.length === 0 ||\n state.functionCallKey.methods.includes(actions[0].params.methodName))\n );\n }\n return false;\n};\n\nconst signUsingKeyPair = async (\n config: WalletConfig,\n state: WalletState,\n { receiverId, actions }: { receiverId: string; actions: Array }\n): Promise => {\n // instantiate an account (NEAR API is a nightmare)\n const myKeyStore = new keyStores.InMemoryKeyStore();\n const keyPair = KeyPair.fromString(state.functionCallKey!.privateKey as any);\n\n await myKeyStore.setKey(\n config.network.networkId,\n state.signedAccountId,\n keyPair\n );\n\n const near = await connect({ ...config.network, keyStore: myKeyStore });\n const account = await near.account(state.signedAccountId);\n\n return account.signAndSendTransaction({\n receiverId,\n actions: actions.map((a) => createAction(a)),\n });\n};\n\nconst requestSignTransactionsUrl = (\n config: WalletConfig,\n txs: Array\n): string => {\n const newUrl = new URL(`${config.walletUrl}/sign-transaction`);\n const stringifiedParam = JSON.stringify(txs, (_, v) => typeof v === 'bigint' ? v.toString() : v);\n const urlParam = encodeURIComponent(stringifiedParam);\n\n newUrl.searchParams.set('transactions_data', urlParam);\n newUrl.searchParams.set('callback_url', window.location.origin);\n\n return newUrl.toString();\n};\n\nconst signAndSendTransactionsPopUp = async (\n config: WalletConfig,\n txs: Array\n): Promise> => {\n const url = requestSignTransactionsUrl(config, txs);\n const txsHashes = (\n await handlePopupTransaction(config, url, (data) => data.transactionHashes)\n )?.split(\",\");\n\n if (!txsHashes) {\n throw new Error(\"No transaction hashes received\");\n }\n return Promise.all(\n txsHashes.map((hash) => config.provider.txStatus(hash, \"unused\"))\n );\n};\n\n\n\nconst signAndSendTransaction = async (\n config: WalletConfig,\n state: WalletState,\n { receiverId, actions }: { receiverId: string; actions: Array }\n): Promise => {\n if (actions.length === 1 && storedKeyCanSign(state, receiverId, actions)) {\n try {\n return await signUsingKeyPair(config, state, { receiverId, actions });\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\n \"Failed to sign using key pair, falling back to wallet\",\n error\n );\n }\n }\n\n const results = await signAndSendTransactionsPopUp(config, [{ signerId: state.signedAccountId, receiverId, actions }]);\n return results[0];\n};\n\nconst signAndSendTransactions = async (\n config: WalletConfig,\n state: WalletState,\n transactionsWS: Array\n): Promise> => {\n\n return signAndSendTransactionsPopUp(config, transactionsWS);\n};\n\n// Helper functions\nconst setupMessageHandler = (\n config: WalletConfig,\n resolve: (value: T) => void,\n reject: (reason?: unknown) => void,\n childWindow: Window | null,\n callback: (result: WalletMessage) => T\n): (event: MessageEvent) => Promise => {\n const handler = async (event: MessageEvent) => {\n const message = event.data as WalletMessage;\n\n // check if the URL are the same\n const origin = new URL(event.origin);\n const walletBaseUrl = new URL(config.walletUrl);\n\n if (origin.origin !== walletBaseUrl.origin) {\n // eslint-disable-next-line no-console\n console.warn(\"Ignoring message from different origin\", origin.origin);\n return;\n }\n\n switch (message.status) {\n case \"success\":\n childWindow?.close();\n resolve(callback(message));\n break;\n case \"failure\":\n childWindow?.close();\n reject(new Error(message.errorMessage || \"Transaction failed\"));\n break;\n default:\n // eslint-disable-next-line no-console\n console.warn(\"Unhandled message status:\", message.status);\n }\n };\n\n return handler;\n};\n\nconst handlePopupTransaction = (\n config: WalletConfig,\n url: string,\n callback: (result: WalletMessage) => T\n): Promise => {\n const screenWidth = window.innerWidth || screen.width;\n const screenHeight = window.innerHeight || screen.height;\n const left = (screenWidth - DEFAULT_POPUP_WIDTH) / 2;\n const top = (screenHeight - DEFAULT_POPUP_HEIGHT) / 2;\n\n const childWindow = window.open(\n url,\n \"BitteWallet\",\n `width=${DEFAULT_POPUP_WIDTH},height=${DEFAULT_POPUP_HEIGHT},top=${top},left=${left}`\n );\n\n if (!childWindow) {\n throw new Error(\n \"Popup window blocked. Please allow popups for this site.\"\n );\n }\n\n return new Promise((resolve, reject) => {\n const messageHandler = setupMessageHandler(\n config,\n resolve,\n reject,\n childWindow,\n callback\n );\n\n window.addEventListener(\"message\", messageHandler);\n\n const intervalId = setInterval(() => {\n if (childWindow.closed) {\n window.removeEventListener(\"message\", messageHandler);\n clearInterval(intervalId);\n reject(new Error(\"User closed the window\"));\n }\n }, POLL_INTERVAL);\n });\n};\n\n\nexport const createBitteWalletConnector = (walletUrl: string, network: Network) => {\n const config = createWalletConfig(walletUrl, network);\n let state = getInitialState();\n\n return {\n getAccountId: () => getAccountId(state),\n getPublicKey: () => getPublicKey(state),\n isSignedIn: () => isSignedIn(state),\n signOut: () => {\n state = signOut();\n return null;\n },\n requestSignIn: async (params: { contractId: string; methodNames?: Array }) => {\n const result = await requestSignIn(config, state, params);\n // Update state after sign-in\n state = getInitialState();\n return result;\n },\n requestSignInUrl: (params: { contractId: string; methodNames?: Array }) => {\n const { url, newState } = requestSignInUrl(config, params);\n state = newState;\n return url;\n },\n signMessage: (params: SignMessageParams) => signMessage(config, params),\n signAndSendTransaction: (params: { receiverId: string; actions: Array }) =>\n signAndSendTransaction(config, state, params),\n signAndSendTransactions: (transactions: Array) =>\n signAndSendTransactions(config, state, transactions),\n };\n};","import type {\n WalletModuleFactory,\n WalletBehaviourFactory,\n Transaction,\n Network,\n Account,\n InjectedWallet,\n} from \"@near-wallet-selector/core\";\nimport { icon } from \"./icon\";\nimport { createBitteWalletConnector } from \"./bitte-wallet\";\nimport { BitteWalletExtraOptions, BitteWalletParams, BitteWalletState } from \"./types\";\n\nconst resolveWalletUrl = (network?: Network, walletUrl?: string) => {\n if (walletUrl) {\n return walletUrl;\n }\n\n if(!network){\n return \"https://wallet.bitte.ai\";\n }\n\n switch (network.networkId) {\n case \"mainnet\":\n return \"https://wallet.bitte.ai\";\n case \"testnet\":\n return \"https://testnet.wallet.bitte.ai\";\n default:\n return \"https://wallet.bitte.ai\";\n }\n};\n\nconst setupWalletState = async (\n params: BitteWalletExtraOptions,\n network: Network\n): Promise => {\n // Use the factory function instead of the class constructor\n const wallet = createBitteWalletConnector(params.walletUrl, network);\n\n return {\n wallet,\n };\n};\n\nconst BitteWallet: WalletBehaviourFactory<\n InjectedWallet,\n { params: BitteWalletExtraOptions }\n> = async ({ metadata, options, store, params, logger }) => {\n const state = await setupWalletState(params, options.network);\n\n const getAccounts = async (): Promise> => {\n const accountId = state.wallet.getAccountId();\n const publicKey = state.wallet.getPublicKey();\n\n return [\n {\n accountId,\n publicKey: publicKey ? publicKey.toString() : \"\",\n },\n ];\n };\n\n return {\n async signIn({ contractId, methodNames }) {\n if (!state.wallet.isSignedIn()) {\n await state.wallet.requestSignIn({\n contractId,\n methodNames,\n });\n }\n\n return getAccounts();\n },\n\n async signOut() {\n state.wallet.signOut();\n },\n\n async getAccounts() {\n return getAccounts();\n },\n\n async verifyOwner() {\n throw new Error(`Method not supported by ${metadata.name}`);\n },\n\n async signMessage({\n message,\n nonce,\n recipient,\n callbackUrl,\n state: sgnState,\n }) {\n logger.log(\"sign message\", { message });\n\n return await state.wallet.signMessage({\n message,\n nonce,\n recipient,\n callbackUrl,\n state: sgnState,\n });\n },\n\n async signAndSendTransaction({ signerId, receiverId, actions }) {\n logger.log(\"signAndSendTransaction\", {\n signerId,\n receiverId,\n actions,\n });\n\n const { contract } = store.getState();\n\n if (!state.wallet.isSignedIn() || !contract) {\n throw new Error(\"Wallet not signed in\");\n }\n\n const signedAccountId = state.wallet.getAccountId();\n\n if (signerId && signedAccountId !== signerId) {\n throw new Error(\n `Signed in as ${signedAccountId}, cannot sign for ${signerId}`\n );\n }\n\n return state.wallet.signAndSendTransaction({\n receiverId: receiverId || contract.contractId,\n actions,\n });\n },\n\n async signAndSendTransactions({ transactions }) {\n logger.log(\"signAndSendTransactions\", { transactions });\n\n if (!state.wallet.isSignedIn()) {\n throw new Error(\"Wallet not signed in\");\n }\n\n return state.wallet.signAndSendTransactions(\n transactions as Array\n );\n },\n\n buildImportAccountsUrl() {\n return `${params.walletUrl}/batch-import`;\n },\n };\n};\n\nexport function setupBitteWallet({\n walletUrl,\n iconUrl = icon,\n deprecated = false,\n}: BitteWalletParams = {}): WalletModuleFactory {\n return async (moduleOptions) => {\n return {\n id: \"bitte-wallet\",\n type: \"injected\",\n metadata: {\n name: \"Bitte Wallet\",\n description:\n \"NEAR wallet to store, buy, send and stake assets for DeFi.\",\n iconUrl,\n deprecated,\n available: true,\n downloadUrl: resolveWalletUrl(moduleOptions.options.network, walletUrl),\n },\n init: (options) => {\n return BitteWallet({\n ...options,\n params: {\n walletUrl: resolveWalletUrl(moduleOptions.options.network, walletUrl),\n },\n });\n },\n };\n };\n}"]} \ No newline at end of file diff --git a/package.json b/package.json index a8e3927..c29ac8c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bitte-ai/wallet", - "version": "0.7.0", + "version": "0.7.2-beta", "description": "Bitte Wallet", "keywords": [ "bitte", @@ -15,15 +15,16 @@ "exports": { ".": { "types": "./dist/index.d.ts", + "require": "./dist/index.js", "import": "./dist/index.mjs", - "require": "./dist/index.js" + "default": "./dist/index.mjs" } }, "files": [ "dist" ], - "main": "dist/index.cjs.js", - "module": "dist/index.esm.js", + "main": "dist/index.js", + "module": "dist/index.mjs.js", "types": "dist/index.d.ts", "publishConfig": { "access": "public" @@ -31,12 +32,12 @@ "author": "Bitte Team", "license": "MIT", "dependencies": { - "@near-wallet-selector/core": "^8.9.16", - "@near-wallet-selector/wallet-utils": "^8.9.16", - "near-api-js": "^5.0.1" + "@near-wallet-selector/core": "^8.10.1", + "@near-wallet-selector/wallet-utils": "^8.10.1", + "near-api-js": "^5.1.1" }, "devDependencies": { "tsup": "^8.3.5", "typescript": "^5.7.3" } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1ebc04..2caa48d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,14 +9,14 @@ importers: .: dependencies: '@near-wallet-selector/core': - specifier: ^8.9.16 - version: 8.9.16(near-api-js@5.0.1) + specifier: ^8.10.1 + version: 8.10.1(near-api-js@5.1.1) '@near-wallet-selector/wallet-utils': - specifier: ^8.9.16 - version: 8.9.16(near-api-js@5.0.1) + specifier: ^8.10.1 + version: 8.10.1(near-api-js@5.1.1) near-api-js: - specifier: ^5.0.1 - version: 5.0.1 + specifier: ^5.1.1 + version: 5.1.1 devDependencies: tsup: specifier: ^8.3.5 @@ -199,60 +199,61 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@near-js/accounts@1.3.1': - resolution: {integrity: sha512-LAUN5L31JKtuXD9xS6D98GLtjG8KL9z761RvTYH6FMAwTFiyPed2M65mKNThGj3Zq46vWRGML0rJ2rlnXvewrA==} + '@near-js/accounts@1.4.1': + resolution: {integrity: sha512-ni3QT9H3NdrbVVKyx56yvz93r89Dvpc/vgVtiIK2OdXjkK6jcj+UKMDRQ6F7rd9qJOInLkHZbVBtcR6j1CXLjw==} - '@near-js/crypto@1.4.1': - resolution: {integrity: sha512-hbricJD0H8nwu63Zw16UZQg3ms2W9NwDBsLt3OEtudTcu9q1MRrVZWc7ATjdmTvhkcgmouEFc6oLBsOxnmSLCA==} + '@near-js/crypto@1.4.2': + resolution: {integrity: sha512-GRfchsyfWvSAPA1gI9hYhw5FH94Ac1BUo+Cmp5rSJt/V0K3xVzCWgOQxvv4R3kDnWjaXJEuAmpEEnr4Bp3FWrA==} - '@near-js/keystores-browser@0.2.1': - resolution: {integrity: sha512-wF7UUDccnkVxdWqVgladupiXkrBmxNK9ilZg6zg9a11xtrDUpnjmWF4ON4tl1lJWF0XdTJmGdOrgOQZQDBQ79g==} + '@near-js/keystores-browser@0.2.2': + resolution: {integrity: sha512-Pxqm7WGtUu6zj32vGCy9JcEDpZDSB5CCaLQDTQdF3GQyL0flyRv2I/guLAgU5FLoYxU7dJAX9mslJhPW7P2Bfw==} - '@near-js/keystores-node@0.1.1': - resolution: {integrity: sha512-ht69dVB0IAX2RckOlBCCTxl7e8X29EYqgL4KE83Sg+cAwsQctAjVLpor5RbgJhg1iYY5BhIK5JgI0pTOJRAHxA==} + '@near-js/keystores-node@0.1.2': + resolution: {integrity: sha512-MWLvTszZOVziiasqIT/LYNhUyWqOJjDGlsthOsY6dTL4ZcXjjmhmzrbFydIIeQr+CcEl5wukTo68ORI9JrHl6g==} - '@near-js/keystores@0.2.1': - resolution: {integrity: sha512-KTeqSB+gx5LZNC9VGtHDe+aEiJts6e3nctMnnn/gqIgvW7KJ+BzcmTZZpxCmQLcy+s7hHSpzmyTVRkaCuYjCcQ==} + '@near-js/keystores@0.2.2': + resolution: {integrity: sha512-DLhi/3a4qJUY+wgphw2Jl4S+L0AKsUYm1mtU0WxKYV5OBwjOXvbGrXNfdkheYkfh3nHwrQgtjvtszX6LrRXLLw==} - '@near-js/providers@1.0.1': - resolution: {integrity: sha512-a1rU+JjTes/fdpnP/SLRQuWAK80os1DoHw2sszg/ccA9byTdI/CM6eKinrWJrO5i86IARfigOgjCJhrzPscvuQ==} + '@near-js/providers@1.0.3': + resolution: {integrity: sha512-VJMboL14R/+MGKnlhhE3UPXCGYvMd1PpvF9OqZ9yBbulV7QVSIdTMfY4U1NnDfmUC2S3/rhAEr+3rMrIcNS7Fg==} - '@near-js/signers@0.2.1': - resolution: {integrity: sha512-l1PnUy4e8NQe5AAHs7mEuWbbUt0rrsZLtcK1UlFaA16MKZmxXdHLMBfUmzyMA4bGzwkyUyGtIebkR+KjBfpEog==} + '@near-js/signers@0.2.2': + resolution: {integrity: sha512-M6ib+af9zXAPRCjH2RyIS0+RhCmd9gxzCeIkQ+I2A3zjgGiEDkBZbYso9aKj8Zh2lPKKSH7h+u8JGymMOSwgyw==} - '@near-js/transactions@1.3.1': - resolution: {integrity: sha512-kL9hxUqBr+tILQHFsh5T/bz3UkJrAq5tnyFqh0xf+7qGXZuRIPfuW/HMq4M6wFw0MGi/8ycmDT3yTQFH7PzZqw==} + '@near-js/transactions@1.3.3': + resolution: {integrity: sha512-1AXD+HuxlxYQmRTLQlkVmH+RAmV3HwkAT8dyZDu+I2fK/Ec9BQHXakOJUnOBws3ihF+akQhamIBS5T0EXX/Ylw==} '@near-js/types@0.3.1': resolution: {integrity: sha512-8qIA7ynAEAuVFNAQc0cqz2xRbfyJH3PaAG5J2MgPPhD18lu/tCGd6pzYg45hjhtiJJRFDRjh/FUWKS+ZiIIxUw==} - '@near-js/utils@1.0.1': - resolution: {integrity: sha512-MzCAspVJJLrURnSbq059s6cWon2/qbbBVl+Ib1yBOMTs/6EuJ7GRvuSmtmSB7l9Hjjmz8Imn1aB2q3RVYZSbrA==} + '@near-js/utils@1.1.0': + resolution: {integrity: sha512-5XWRq7xpu8Wud9pRXe2U347KXyi0mXofedUY2DQ9TaqiZUcMIaN9xj7DbCs2v6dws3pJyYrT1KWxeNp5fSaY3w==} - '@near-js/wallet-account@1.3.1': - resolution: {integrity: sha512-POOKarJnYsTK0zEXygm43ecGlraPl5qagQHl+By5bk0zQFgeKaoFIJK/n04xUoGBhZTBIVp1/q7q3O1pB57hqg==} + '@near-js/wallet-account@1.3.3': + resolution: {integrity: sha512-GDzg/Kz0GBYF7tQfyQQQZ3vviwV8yD+8F2lYDzsWJiqIln7R1ov0zaXN4Tii86TeS21KPn2hHAsVu3Y4txa8OQ==} - '@near-wallet-selector/core@8.9.16': - resolution: {integrity: sha512-Bq+bZvwpsYgs8g4mtDMEMUpHwD/+VlHY3hj5pLv6o6C/3Ym0/540/8ydd9VUhMsdpY0Dhv2SLamKiL6PJK6THA==} + '@near-wallet-selector/core@8.10.1': + resolution: {integrity: sha512-FHZNLIPF3Qvj2M8cwyeHFH0Gwq58q7ibw02r+TkekyzZgXESvd/kU/OcF11T4r3WG1OrHPiZay7XXeAwDc9Txw==} peerDependencies: near-api-js: ^4.0.0 || ^5.0.0 - '@near-wallet-selector/wallet-utils@8.9.16': - resolution: {integrity: sha512-/qIaazrYMZ240eCYpW4SV35Yspe2Ba/NY9Z3f5aodQBZSI9QvjzZxQkxux68JuPt4J2+c9oKKK4XvbFqYP/aSQ==} + '@near-wallet-selector/wallet-utils@8.10.1': + resolution: {integrity: sha512-1NxFCGo7bo+CiKOOS4yjSAwAfnjhYYXo3i1UCuu4MhHrQS+EvwMCxCadUKSNGXn1IC1TpKmWMVaENkv7gWKlZQ==} peerDependencies: near-api-js: ^4.0.0 || ^5.0.0 - '@noble/curves@1.2.0': - resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - - '@noble/hashes@1.3.2': - resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} - engines: {node: '>= 16'} + '@noble/curves@1.8.1': + resolution: {integrity: sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==} + engines: {node: ^14.21.3 || >=16} '@noble/hashes@1.3.3': resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} engines: {node: '>= 16'} + '@noble/hashes@1.7.1': + resolution: {integrity: sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==} + engines: {node: ^14.21.3 || >=16} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -352,6 +353,9 @@ packages: cpu: [x64] os: [win32] + '@scure/base@1.2.4': + resolution: {integrity: sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -380,11 +384,6 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base-x@2.0.6: - resolution: {integrity: sha512-UAmjxz9KbK+YIi66xej+pZVo/vxUOh49ubEvZW5egCbxhur05pBb+hwuireQwKO4nDpsNm64/jEei17LEpsr5g==} - engines: {node: '>=4.5.0'} - deprecated: use 3.0.0 instead, safe-buffer has been merged and release for compatability - bn.js@4.12.1: resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} @@ -397,9 +396,6 @@ packages: brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - bs58@4.0.0: - resolution: {integrity: sha512-/jcGuUuSebyxwLLfKrbKnCJttxRf9PM51EnHTwmFKBxl4z1SGkoAhrfd6uZKE0dcjQTfm6XzTP8DPr1tzE4KIw==} - bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -471,8 +467,8 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + exponential-backoff@3.1.2: + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} fdir@6.4.3: resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} @@ -533,9 +529,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isomorphic-unfetch@3.1.0: - resolution: {integrity: sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==} - jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -595,11 +588,11 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - near-abi@0.1.1: - resolution: {integrity: sha512-RVDI8O+KVxRpC3KycJ1bpfVj9Zv+xvq9PlW1yIFl46GhrnLw83/72HqHGjGDjQ8DtltkcpSjY9X3YIGZ+1QyzQ==} + near-abi@0.2.0: + resolution: {integrity: sha512-kCwSf/3fraPU2zENK18sh+kKG4uKbEUEQdyWQkmW8ZofmLarObIz2+zAYjA1teDZLeMvEQew3UysnPDXgjneaA==} - near-api-js@5.0.1: - resolution: {integrity: sha512-ZSQYIQdekIvSRfOFuRj6MW11jtK5lsOaiWM2VB0nq7eROuuxwSSXHg+syjCXl3HNNZ3hzg0CNdp+5Za0X1ZtYg==} + near-api-js@5.1.1: + resolution: {integrity: sha512-h23BGSKxNv8ph+zU6snicstsVK1/CTXsQz4LuGGwoRE24Hj424nSe4+/1tzoiC285Ljf60kPAqRCmsfv9etF2g==} node-addon-api@5.1.0: resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} @@ -613,15 +606,6 @@ packages: encoding: optional: true - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -696,9 +680,9 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - secp256k1@5.0.0: - resolution: {integrity: sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==} - engines: {node: '>=14.0.0'} + secp256k1@5.0.1: + resolution: {integrity: sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==} + engines: {node: '>=18.0.0'} setprototypeof@1.1.1: resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} @@ -802,9 +786,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - unfetch@4.2.0: - resolution: {integrity: sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -937,120 +918,118 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@near-js/accounts@1.3.1': + '@near-js/accounts@1.4.1': dependencies: - '@near-js/crypto': 1.4.1 - '@near-js/providers': 1.0.1 - '@near-js/signers': 0.2.1 - '@near-js/transactions': 1.3.1 + '@near-js/crypto': 1.4.2 + '@near-js/providers': 1.0.3 + '@near-js/signers': 0.2.2 + '@near-js/transactions': 1.3.3 '@near-js/types': 0.3.1 - '@near-js/utils': 1.0.1 - '@noble/hashes': 1.3.3 + '@near-js/utils': 1.1.0 + '@noble/hashes': 1.7.1 borsh: 1.0.0 depd: 2.0.0 is-my-json-valid: 2.20.6 - isomorphic-unfetch: 3.1.0 lru_map: 0.4.1 - near-abi: 0.1.1 + near-abi: 0.2.0 transitivePeerDependencies: - encoding - '@near-js/crypto@1.4.1': + '@near-js/crypto@1.4.2': dependencies: '@near-js/types': 0.3.1 - '@near-js/utils': 1.0.1 - '@noble/curves': 1.2.0 + '@near-js/utils': 1.1.0 + '@noble/curves': 1.8.1 borsh: 1.0.0 randombytes: 2.1.0 - secp256k1: 5.0.0 + secp256k1: 5.0.1 - '@near-js/keystores-browser@0.2.1': + '@near-js/keystores-browser@0.2.2': dependencies: - '@near-js/crypto': 1.4.1 - '@near-js/keystores': 0.2.1 + '@near-js/crypto': 1.4.2 + '@near-js/keystores': 0.2.2 - '@near-js/keystores-node@0.1.1': + '@near-js/keystores-node@0.1.2': dependencies: - '@near-js/crypto': 1.4.1 - '@near-js/keystores': 0.2.1 + '@near-js/crypto': 1.4.2 + '@near-js/keystores': 0.2.2 - '@near-js/keystores@0.2.1': + '@near-js/keystores@0.2.2': dependencies: - '@near-js/crypto': 1.4.1 + '@near-js/crypto': 1.4.2 '@near-js/types': 0.3.1 - '@near-js/providers@1.0.1': + '@near-js/providers@1.0.3': dependencies: - '@near-js/transactions': 1.3.1 + '@near-js/transactions': 1.3.3 '@near-js/types': 0.3.1 - '@near-js/utils': 1.0.1 + '@near-js/utils': 1.1.0 borsh: 1.0.0 - exponential-backoff: 3.1.1 - isomorphic-unfetch: 3.1.0 + exponential-backoff: 3.1.2 optionalDependencies: node-fetch: 2.6.7 transitivePeerDependencies: - encoding - '@near-js/signers@0.2.1': + '@near-js/signers@0.2.2': dependencies: - '@near-js/crypto': 1.4.1 - '@near-js/keystores': 0.2.1 + '@near-js/crypto': 1.4.2 + '@near-js/keystores': 0.2.2 '@noble/hashes': 1.3.3 - '@near-js/transactions@1.3.1': + '@near-js/transactions@1.3.3': dependencies: - '@near-js/crypto': 1.4.1 - '@near-js/signers': 0.2.1 + '@near-js/crypto': 1.4.2 + '@near-js/signers': 0.2.2 '@near-js/types': 0.3.1 - '@near-js/utils': 1.0.1 - '@noble/hashes': 1.3.3 + '@near-js/utils': 1.1.0 + '@noble/hashes': 1.7.1 borsh: 1.0.0 '@near-js/types@0.3.1': {} - '@near-js/utils@1.0.1': + '@near-js/utils@1.1.0': dependencies: '@near-js/types': 0.3.1 - bs58: 4.0.0 + '@scure/base': 1.2.4 depd: 2.0.0 mustache: 4.0.0 - '@near-js/wallet-account@1.3.1': + '@near-js/wallet-account@1.3.3': dependencies: - '@near-js/accounts': 1.3.1 - '@near-js/crypto': 1.4.1 - '@near-js/keystores': 0.2.1 - '@near-js/providers': 1.0.1 - '@near-js/signers': 0.2.1 - '@near-js/transactions': 1.3.1 + '@near-js/accounts': 1.4.1 + '@near-js/crypto': 1.4.2 + '@near-js/keystores': 0.2.2 + '@near-js/providers': 1.0.3 + '@near-js/signers': 0.2.2 + '@near-js/transactions': 1.3.3 '@near-js/types': 0.3.1 - '@near-js/utils': 1.0.1 + '@near-js/utils': 1.1.0 borsh: 1.0.0 transitivePeerDependencies: - encoding - '@near-wallet-selector/core@8.9.16(near-api-js@5.0.1)': + '@near-wallet-selector/core@8.10.1(near-api-js@5.1.1)': dependencies: borsh: 1.0.0 events: 3.3.0 js-sha256: 0.9.0 - near-api-js: 5.0.1 + near-api-js: 5.1.1 rxjs: 7.8.1 - '@near-wallet-selector/wallet-utils@8.9.16(near-api-js@5.0.1)': + '@near-wallet-selector/wallet-utils@8.10.1(near-api-js@5.1.1)': dependencies: - '@near-wallet-selector/core': 8.9.16(near-api-js@5.0.1) - near-api-js: 5.0.1 + '@near-wallet-selector/core': 8.10.1(near-api-js@5.1.1) + near-api-js: 5.1.1 - '@noble/curves@1.2.0': + '@noble/curves@1.8.1': dependencies: - '@noble/hashes': 1.3.2 - - '@noble/hashes@1.3.2': {} + '@noble/hashes': 1.7.1 '@noble/hashes@1.3.3': {} + '@noble/hashes@1.7.1': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -1111,6 +1090,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.34.1': optional: true + '@scure/base@1.2.4': {} + '@types/estree@1.0.6': {} '@types/json-schema@7.0.15': {} @@ -1129,10 +1110,6 @@ snapshots: balanced-match@1.0.2: {} - base-x@2.0.6: - dependencies: - safe-buffer: 5.2.1 - bn.js@4.12.1: {} borsh@1.0.0: {} @@ -1143,10 +1120,6 @@ snapshots: brorand@1.1.0: {} - bs58@4.0.0: - dependencies: - base-x: 2.0.6 - bundle-require@5.1.0(esbuild@0.24.2): dependencies: esbuild: 0.24.2 @@ -1228,7 +1201,7 @@ snapshots: events@3.3.0: {} - exponential-backoff@3.1.1: {} + exponential-backoff@3.1.2: {} fdir@6.4.3(picomatch@4.0.2): optionalDependencies: @@ -1298,13 +1271,6 @@ snapshots: isexe@2.0.0: {} - isomorphic-unfetch@3.1.0: - dependencies: - node-fetch: 2.7.0 - unfetch: 4.2.0 - transitivePeerDependencies: - - encoding - jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -1349,28 +1315,28 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - near-abi@0.1.1: + near-abi@0.2.0: dependencies: '@types/json-schema': 7.0.15 - near-api-js@5.0.1: + near-api-js@5.1.1: dependencies: - '@near-js/accounts': 1.3.1 - '@near-js/crypto': 1.4.1 - '@near-js/keystores': 0.2.1 - '@near-js/keystores-browser': 0.2.1 - '@near-js/keystores-node': 0.1.1 - '@near-js/providers': 1.0.1 - '@near-js/signers': 0.2.1 - '@near-js/transactions': 1.3.1 + '@near-js/accounts': 1.4.1 + '@near-js/crypto': 1.4.2 + '@near-js/keystores': 0.2.2 + '@near-js/keystores-browser': 0.2.2 + '@near-js/keystores-node': 0.1.2 + '@near-js/providers': 1.0.3 + '@near-js/signers': 0.2.2 + '@near-js/transactions': 1.3.3 '@near-js/types': 0.3.1 - '@near-js/utils': 1.0.1 - '@near-js/wallet-account': 1.3.1 - '@noble/curves': 1.2.0 + '@near-js/utils': 1.1.0 + '@near-js/wallet-account': 1.3.3 + '@noble/curves': 1.8.1 borsh: 1.0.0 depd: 2.0.0 http-errors: 1.7.2 - near-abi: 0.1.1 + near-abi: 0.2.0 node-fetch: 2.6.7 transitivePeerDependencies: - encoding @@ -1381,10 +1347,6 @@ snapshots: dependencies: whatwg-url: 5.0.0 - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - node-gyp-build@4.8.4: {} object-assign@4.1.1: {} @@ -1449,7 +1411,7 @@ snapshots: safe-buffer@5.2.1: {} - secp256k1@5.0.0: + secp256k1@5.0.1: dependencies: elliptic: 6.6.1 node-addon-api: 5.1.0 @@ -1558,8 +1520,6 @@ snapshots: typescript@5.7.3: {} - unfetch@4.2.0: {} - webidl-conversions@3.0.1: {} webidl-conversions@4.0.2: {} diff --git a/src/bitte-wallet.ts b/src/bitte-wallet.ts index 772ef1b..5427cd2 100644 --- a/src/bitte-wallet.ts +++ b/src/bitte-wallet.ts @@ -5,12 +5,11 @@ import type { SignMessageParams, Transaction, } from "@near-wallet-selector/core"; - import { createAction } from "@near-wallet-selector/wallet-utils"; -import { connect, keyStores, providers, transactions } from "near-api-js"; -import type { PublicKey } from "near-api-js/lib/utils"; -import { KeyPair, serialize } from "near-api-js/lib/utils"; +import { createAction } from "@near-wallet-selector/wallet-utils"; +import { connect, keyStores, providers } from "near-api-js"; +import type { PublicKey } from "near-api-js/lib/utils/index.js"; +import { KeyPair } from "near-api-js/lib/utils/index.js"; import { WalletConfig, WalletMessage, WalletResponseData, WalletState } from "./types"; -import type { Transaction as WalletSelectorTransaction, Action as WalletSelectorAction } from "@near-wallet-selector/core"; // Constants @@ -21,13 +20,13 @@ const POLL_INTERVAL = 300; // State management const getInitialState = (): WalletState => ({ - signedAccountId: localStorage.getItem("signedAccountId") || "", - functionCallKey: JSON.parse(localStorage.getItem("functionCallKey") || "null"), + signedAccountId: localStorage.getItem("bitte:signedAccountId") || "", + functionCallKey: JSON.parse(localStorage.getItem("bitte:functionCallKey") || "null"), }); const saveState = (state: WalletState): void => { - localStorage.setItem("signedAccountId", state.signedAccountId); - localStorage.setItem("functionCallKey", JSON.stringify(state.functionCallKey)); + localStorage.setItem("bitte:signedAccountId", state.signedAccountId); + localStorage.setItem("bitte:functionCallKey", JSON.stringify(state.functionCallKey)); }; // Create wallet configuration @@ -153,26 +152,6 @@ const signMessage = async ( }); }; -const completeTransaction = async ( - config: WalletConfig, - state: WalletState, - { receiverId, actions }: { receiverId: string; actions: Array } -): Promise => { - // To create a transaction we need a recent block - const block = await config.provider.block({ finality: "final" }); - const blockHash = serialize.base_decode(block.header.hash); - - // create Transaction for the wallet - return transactions.createTransaction( - state.signedAccountId, - KeyPair.fromRandom("ed25519").getPublicKey(), - receiverId, - 0, - actions.map((a) => createAction(a)), - Uint8Array.from(blockHash) - ); -}; - const storedKeyCanSign = ( state: WalletState, receiverId: string, @@ -218,11 +197,10 @@ const signUsingKeyPair = async ( const requestSignTransactionsUrl = ( config: WalletConfig, - txs: Array + txs: Array ): string => { const newUrl = new URL(`${config.walletUrl}/sign-transaction`); - - const stringifiedParam = JSON.stringify(txs); + const stringifiedParam = JSON.stringify(txs, (_, v) => typeof v === 'bigint' ? v.toString() : v); const urlParam = encodeURIComponent(stringifiedParam); newUrl.searchParams.set('transactions_data', urlParam); @@ -267,10 +245,7 @@ const signAndSendTransaction = async ( } } - - const tx = await completeTransaction(config, state, { receiverId, actions }); - - const results = await signAndSendTransactionsPopUp(config, [tx as any]); + const results = await signAndSendTransactionsPopUp(config, [{ signerId: state.signedAccountId, receiverId, actions }]); return results[0]; }; From 25b0303b59fc22f16c15326895c7de2ca9d724ab Mon Sep 17 00:00:00 2001 From: Ruben Marcus Date: Mon, 24 Mar 2025 15:27:11 +0000 Subject: [PATCH 2/4] remove dist --- .gitignore | 3 ++- dist/index.d.mts | 13 ------------- dist/index.d.ts | 13 ------------- dist/index.js | 3 --- dist/index.js.map | 1 - dist/index.mjs | 3 --- dist/index.mjs.map | 1 - 7 files changed, 2 insertions(+), 35 deletions(-) delete mode 100644 dist/index.d.mts delete mode 100644 dist/index.d.ts delete mode 100644 dist/index.js delete mode 100644 dist/index.js.map delete mode 100644 dist/index.mjs delete mode 100644 dist/index.mjs.map diff --git a/.gitignore b/.gitignore index b512c09..76add87 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -node_modules \ No newline at end of file +node_modules +dist \ No newline at end of file diff --git a/dist/index.d.mts b/dist/index.d.mts deleted file mode 100644 index a3007c0..0000000 --- a/dist/index.d.mts +++ /dev/null @@ -1,13 +0,0 @@ -import { WalletModuleFactory, InjectedWallet } from '@near-wallet-selector/core'; - -interface BitteWalletParams { - walletUrl?: string; - iconUrl?: string; - deprecated?: boolean; - successUrl?: string; - failureUrl?: string; -} - -declare function setupBitteWallet({ walletUrl, iconUrl, deprecated, }?: BitteWalletParams): WalletModuleFactory; - -export { setupBitteWallet }; diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index a3007c0..0000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { WalletModuleFactory, InjectedWallet } from '@near-wallet-selector/core'; - -interface BitteWalletParams { - walletUrl?: string; - iconUrl?: string; - deprecated?: boolean; - successUrl?: string; - failureUrl?: string; -} - -declare function setupBitteWallet({ walletUrl, iconUrl, deprecated, }?: BitteWalletParams): WalletModuleFactory; - -export { setupBitteWallet }; diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index cc9468d..0000000 --- a/dist/index.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict';var walletUtils=require('@near-wallet-selector/wallet-utils'),nearApiJs=require('near-api-js'),index_js=require('near-api-js/lib/utils/index.js');var j="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTUiIGhlaWdodD0iOTUiIHZpZXdCb3g9IjAgMCA5NSA5NSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xLjc3NjE3IDU5LjE4MjZMNjIuNzIyNyA2My4zMTNDNjMuMTE4NSA2My40MzA5IDYzLjQ3ODggNjMuNjQ1NiA2My43NzA4IDYzLjkzNzdDNjQuMDYyOSA2NC4yMjk3IDY0LjI3NzUgNjQuNTg5OSA2NC4zOTU0IDY0Ljk4NThMNjguNTI1OSA3OC44NTU1QzY4LjY3ODcgNzkuMzY4NiA2OC45OTMyIDc5LjgxODYgNjkuNDIyNCA4MC4xMzg3QzY5Ljg1MTYgODAuNDU4NyA3MC4zNzI3IDgwLjYzMTYgNzAuOTA4MiA4MC42MzE2QzcxLjQ0MzYgODAuNjMxNiA3MS45NjQ3IDgwLjQ1ODcgNzIuMzkzOSA4MC4xMzg3QzcyLjgyMzEgNzkuODE4NiA3My4xMzc2IDc5LjM2ODYgNzMuMjkwNCA3OC44NTU1TDc3LjQyMDkgNjQuOTg1OEM3Ny41Mzg4IDY0LjU4OTkgNzcuNzUzNCA2NC4yMjk3IDc4LjA0NTUgNjMuOTM3N0M3OC4zMzc2IDYzLjY0NTYgNzguNjk3OCA2My40MzA5IDc5LjA5MzYgNjMuMzEzTDkyLjk2MzMgNTkuMTgyNkM5My40NzY0IDU5LjAyOTcgOTMuOTI2NSA1OC43MTUzIDk0LjI0NjYgNTguMjg2MUM5NC41NjY2IDU3Ljg1NjggOTQuNzM5NSA1Ny4zMzU3IDk0LjczOTUgNTYuODAwM0M5NC43Mzk1IDU2LjI2NDkgOTQuNTY2NiA1NS43NDM4IDk0LjI0NjYgNTUuMzE0NkM5My45MjY1IDU0Ljg4NTMgOTMuNDc2NCA1NC41NzA5IDkyLjk2MzMgNTQuNDE4MUw3OS4wOTM3IDUwLjI4NzZDNzguNjk3OCA1MC4xNjk3IDc4LjMzNzYgNDkuOTU1IDc4LjA0NTUgNDkuNjYzQzc3Ljc1MzUgNDkuMzcwOSA3Ny41Mzg4IDQ5LjAxMDcgNzcuNDIwOSA0OC42MTQ4TDczLjI5MDQgMzQuNzQ1MkM3My4xMzc2IDM0LjIzMiA3Mi44MjMyIDMzLjc4MTkgNzIuMzkzOSAzMy40NjE5QzcxLjk2NDcgMzMuMTQxOSA3MS40NDM2IDMyLjk2OSA3MC45MDgyIDMyLjk2OUM3MC4zNzI4IDMyLjk2OSA2OS44NTE3IDMzLjE0MTkgNjkuNDIyNCAzMy40NjE5QzY4Ljk5MzIgMzMuNzgxOSA2OC42Nzg4IDM0LjIzMiA2OC41MjYgMzQuNzQ1Mkw2NC4zOTU0IDQ4LjYxNDhDNjQuMjc3NiA0OS4wMTA3IDY0LjA2MjkgNDkuMzcwOSA2My43NzA4IDQ5LjY2M0M2My40Nzg4IDQ5Ljk1NSA2My4xMTg1IDUwLjE2OTcgNjIuNzIyNyA1MC4yODc2TDEuNzc2MTggNTQuNDE4MUMxLjI2MzA1IDU0LjU3MDkgMC44MTI5NTYgNTQuODg1MyAwLjQ5MjkyIDU1LjMxNDZDMC4xNzI4ODQgNTUuNzQzOCAyLjI0NzU1ZS0wNiA1Ni4yNjQ5IDAgNTYuODAwM0MtMi4yNDc1MWUtMDYgNTcuMzM1NyAwLjE3Mjg4NyA1Ny44NTY4IDAuNDkyOTIgNTguMjg2MUMwLjgxMjk1MyA1OC43MTUzIDEuMjYzMDMgNTkuMDI5NyAxLjc3NjE3IDU5LjE4MjZaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMyLjE2MzcgMjkuNDg2OEw0MC4zNTc4IDMxLjkyNzFDNDAuNTkxNyAzMS45OTY3IDQwLjgwNDUgMzIuMTIzNiA0MC45NzcgMzIuMjk2MUM0MS4xNDk2IDMyLjQ2ODcgNDEuMjc2NCAzMi42ODE1IDQxLjM0NjEgMzIuOTE1NEw0My43ODYzIDQxLjEwOTVDNDMuODc2NiA0MS40MTI2IDQ0LjA2MjQgNDEuNjc4NSA0NC4zMTYgNDEuODY3NkM0NC41Njk2IDQyLjA1NjcgNDQuODc3NCA0Mi4xNTg4IDQ1LjE5MzcgNDIuMTU4OEM0NS41MTAxIDQyLjE1ODggNDUuODE3OSA0Mi4wNTY3IDQ2LjA3MTUgNDEuODY3NkM0Ni4zMjUxIDQxLjY3ODUgNDYuNTEwOSA0MS40MTI2IDQ2LjYwMTEgNDEuMTA5NUw0OS4wNDE0IDMyLjkxNTRDNDkuMTExMSAzMi42ODE1IDQ5LjIzNzkgMzIuNDY4NyA0OS40MTA0IDMyLjI5NjFDNDkuNTgzIDMyLjEyMzYgNDkuNzk1OCAzMS45OTY3IDUwLjAyOTcgMzEuOTI3MUw1OC4yMjM4IDI5LjQ4NjhDNTguNTI2OSAyOS4zOTY2IDU4Ljc5MjggMjkuMjEwOCA1OC45ODE5IDI4Ljk1NzJDNTkuMTcxIDI4LjcwMzYgNTkuMjczMSAyOC4zOTU4IDU5LjI3MzEgMjguMDc5NEM1OS4yNzMxIDI3Ljc2MzEgNTkuMTcxIDI3LjQ1NTMgNTguOTgxOSAyNy4yMDE3QzU4Ljc5MjggMjYuOTQ4MSA1OC41MjY5IDI2Ljc2MjMgNTguMjIzOCAyNi42NzJMNTAuMDI5NiAyNC4yMzE3QzQ5Ljc5NTggMjQuMTYyMSA0OS41ODI5IDI0LjAzNTIgNDkuNDEwNCAyMy44NjI3QzQ5LjIzNzkgMjMuNjkwMiA0OS4xMTEgMjMuNDc3MyA0OS4wNDE0IDIzLjI0MzRMNDYuNjAxMSAxNS4wNDkzQzQ2LjUxMDggMTQuNzQ2MiA0Ni4zMjUgMTQuNDgwMyA0Ni4wNzE1IDE0LjI5MTJDNDUuODE3OSAxNC4xMDIxIDQ1LjUxIDE0IDQ1LjE5MzcgMTRDNDQuODc3NCAxNCA0NC41Njk1IDE0LjEwMjEgNDQuMzE1OSAxNC4yOTEyQzQ0LjA2MjMgMTQuNDgwMyA0My44NzY2IDE0Ljc0NjIgNDMuNzg2MyAxNS4wNDkzTDQxLjM0NiAyMy4yNDM0QzQxLjI3NjQgMjMuNDc3MyA0MS4xNDk1IDIzLjY5MDIgNDAuOTc3IDIzLjg2MjdDNDAuODA0NCAyNC4wMzUyIDQwLjU5MTYgMjQuMTYyMSA0MC4zNTc4IDI0LjIzMTdMMzIuMTYzNyAyNi42NzJDMzEuODYwNSAyNi43NjIyIDMxLjU5NDYgMjYuOTQ4IDMxLjQwNTUgMjcuMjAxNkMzMS4yMTY0IDI3LjQ1NTIgMzEuMTE0MyAyNy43NjMxIDMxLjExNDMgMjguMDc5NEMzMS4xMTQzIDI4LjM5NTggMzEuMjE2NCAyOC43MDM3IDMxLjQwNTUgMjguOTU3MkMzMS41OTQ2IDI5LjIxMDggMzEuODYwNSAyOS4zOTY2IDMyLjE2MzcgMjkuNDg2OFoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=";var y=480,A=640,k=300,N=()=>({signedAccountId:localStorage.getItem("bitte:signedAccountId")||"",functionCallKey:JSON.parse(localStorage.getItem("bitte:functionCallKey")||"null")}),I=t=>{localStorage.setItem("bitte:signedAccountId",t.signedAccountId),localStorage.setItem("bitte:functionCallKey",JSON.stringify(t.functionCallKey));},E=(t,a)=>({walletUrl:t,network:a,provider:new nearApiJs.providers.JsonRpcProvider({url:a.nodeUrl})}),C=t=>t.signedAccountId,p=t=>{if(t.functionCallKey)return index_js.KeyPair.fromString(t.functionCallKey.privateKey).getPublicKey()},U=t=>!!t.signedAccountId,Q=()=>{let t={signedAccountId:"",functionCallKey:null};return I(t),t},d=(t,{contractId:a,methodNames:e})=>{let r=new URL(window.location.href),n=new URL(`${t.walletUrl}/login/`);n.searchParams.set("success_url",r.href),n.searchParams.set("failure_url",r.href);let i=null;if(a){n.searchParams.set("contract_id",a);let s=index_js.KeyPair.fromRandom("ed25519");n.searchParams.set("public_key",s.getPublicKey().toString()),i={privateKey:s.toString(),contractId:a,methods:e||[]};}e&&e.forEach(s=>{n.searchParams.append("methodNames",s);});let o=N();return o.functionCallKey=i,I(o),{url:n.toString(),newState:o}},f=async(t,a,{contractId:e,methodNames:r})=>{let{url:n,newState:i}=d(t,{contractId:e,methodNames:r});return D(t,n,async o=>{let s=o,{public_key:c,account_id:l}=s;if(l){let M={...i,signedAccountId:l};return I(M),[{accountId:l,publicKey:c||""}]}throw new Error("Invalid response data from wallet")})},x=async(t,{message:a,nonce:e,recipient:r,callbackUrl:n,state:i})=>{let o=n||window.location.href;if(!o)throw new Error("BitteWallet: CallbackUrl is missing");let s=new URL(t.walletUrl);return s.pathname="sign-message",s.searchParams.append("message",a),s.searchParams.append("nonce",e.toString("base64")),s.searchParams.append("recipient",r),s.searchParams.append("callbackUrl",o),i&&s.searchParams.append("state",i),D(t,s.toString(),c=>({accountId:c?.signedRequest?.accountId||"",publicKey:c?.signedRequest?.publicKey||"",signature:c?.signedRequest?.signature||""}))},h=(t,a,e)=>t.functionCallKey&&t.functionCallKey.contractId===a?e[0].type==="FunctionCall"&&e[0].params.deposit==="0"&&(t.functionCallKey.methods.length===0||t.functionCallKey.methods.includes(e[0].params.methodName)):false,W=async(t,a,{receiverId:e,actions:r})=>{let n=new nearApiJs.keyStores.InMemoryKeyStore,i=index_js.KeyPair.fromString(a.functionCallKey.privateKey);return await n.setKey(t.network.networkId,a.signedAccountId,i),(await(await nearApiJs.connect({...t.network,keyStore:n})).account(a.signedAccountId)).signAndSendTransaction({receiverId:e,actions:r.map(c=>walletUtils.createAction(c))})},Y=(t,a)=>{let e=new URL(`${t.walletUrl}/sign-transaction`),r=JSON.stringify(a,(i,o)=>typeof o=="bigint"?o.toString():o),n=encodeURIComponent(r);return e.searchParams.set("transactions_data",n),e.searchParams.set("callback_url",window.location.origin),e.toString()},z=async(t,a)=>{let e=Y(t,a),r=(await D(t,e,n=>n.transactionHashes))?.split(",");if(!r)throw new Error("No transaction hashes received");return Promise.all(r.map(n=>t.provider.txStatus(n,"unused")))},P=async(t,a,{receiverId:e,actions:r})=>{if(r.length===1&&h(a,e,r))try{return await W(t,a,{receiverId:e,actions:r})}catch(i){console.warn("Failed to sign using key pair, falling back to wallet",i);}return (await z(t,[{signerId:a.signedAccountId,receiverId:e,actions:r}]))[0]},b=async(t,a,e)=>z(t,e),K=(t,a,e,r,n)=>async o=>{let s=o.data,c=new URL(o.origin),l=new URL(t.walletUrl);if(c.origin!==l.origin){console.warn("Ignoring message from different origin",c.origin);return}switch(s.status){case "success":r?.close(),a(n(s));break;case "failure":r?.close(),e(new Error(s.errorMessage||"Transaction failed"));break;default:console.warn("Unhandled message status:",s.status);}},D=(t,a,e)=>{let r=window.innerWidth||screen.width,n=window.innerHeight||screen.height,i=(r-y)/2,o=(n-A)/2,s=window.open(a,"BitteWallet",`width=${y},height=${A},top=${o},left=${i}`);if(!s)throw new Error("Popup window blocked. Please allow popups for this site.");return new Promise((c,l)=>{let M=K(t,c,l,s,e);window.addEventListener("message",M);let g=setInterval(()=>{s.closed&&(window.removeEventListener("message",M),clearInterval(g),l(new Error("User closed the window")));},k);})},T=(t,a)=>{let e=E(t,a),r=N();return {getAccountId:()=>C(r),getPublicKey:()=>p(r),isSignedIn:()=>U(r),signOut:()=>(r=Q(),null),requestSignIn:async n=>{let i=await f(e,r,n);return r=N(),i},requestSignInUrl:n=>{let{url:i,newState:o}=d(e,n);return r=o,i},signMessage:n=>x(e,n),signAndSendTransaction:n=>P(e,r,n),signAndSendTransactions:n=>b(e,r,n)}};var w=(t,a)=>{if(a)return a;if(!t)return "https://wallet.bitte.ai";switch(t.networkId){case "mainnet":return "https://wallet.bitte.ai";case "testnet":return "https://testnet.wallet.bitte.ai";default:return "https://wallet.bitte.ai"}},v=async(t,a)=>({wallet:T(t.walletUrl,a)}),B=async({metadata:t,options:a,store:e,params:r,logger:n})=>{let i=await v(r,a.network),o=async()=>{let s=i.wallet.getAccountId(),c=i.wallet.getPublicKey();return [{accountId:s,publicKey:c?c.toString():""}]};return {async signIn({contractId:s,methodNames:c}){return i.wallet.isSignedIn()||await i.wallet.requestSignIn({contractId:s,methodNames:c}),o()},async signOut(){i.wallet.signOut();},async getAccounts(){return o()},async verifyOwner(){throw new Error(`Method not supported by ${t.name}`)},async signMessage({message:s,nonce:c,recipient:l,callbackUrl:M,state:g}){return n.log("sign message",{message:s}),await i.wallet.signMessage({message:s,nonce:c,recipient:l,callbackUrl:M,state:g})},async signAndSendTransaction({signerId:s,receiverId:c,actions:l}){n.log("signAndSendTransaction",{signerId:s,receiverId:c,actions:l});let{contract:M}=e.getState();if(!i.wallet.isSignedIn()||!M)throw new Error("Wallet not signed in");let g=i.wallet.getAccountId();if(s&&g!==s)throw new Error(`Signed in as ${g}, cannot sign for ${s}`);return i.wallet.signAndSendTransaction({receiverId:c||M.contractId,actions:l})},async signAndSendTransactions({transactions:s}){if(n.log("signAndSendTransactions",{transactions:s}),!i.wallet.isSignedIn())throw new Error("Wallet not signed in");return i.wallet.signAndSendTransactions(s)},buildImportAccountsUrl(){return `${r.walletUrl}/batch-import`}}};function Z({walletUrl:t,iconUrl:a=j,deprecated:e=false}={}){return async r=>({id:"bitte-wallet",type:"injected",metadata:{name:"Bitte Wallet",description:"NEAR wallet to store, buy, send and stake assets for DeFi.",iconUrl:a,deprecated:e,available:true,downloadUrl:w(r.options.network,t)},init:n=>B({...n,params:{walletUrl:w(r.options.network,t)}})})} -exports.setupBitteWallet=Z;//# sourceMappingURL=index.js.map -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map deleted file mode 100644 index 784485d..0000000 --- a/dist/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/icon.ts","../src/bitte-wallet.ts","../src/bitte-wallet-setup.ts"],"names":["icon","DEFAULT_POPUP_WIDTH","DEFAULT_POPUP_HEIGHT","POLL_INTERVAL","getInitialState","saveState","state","createWalletConfig","walletUrl","network","providers","getAccountId","getPublicKey","KeyPair","isSignedIn","signOut","newState","requestSignInUrl","config","contractId","methodNames","currentUrl","newUrl","functionCallKey","accessKey","methodName","requestSignIn","url","handlePopupTransaction","data","responseData","publicKey","accountId","updatedState","signMessage","message","nonce","recipient","callbackUrl","messageState","href","value","storedKeyCanSign","receiverId","actions","signUsingKeyPair","myKeyStore","keyStores","keyPair","connect","a","createAction","requestSignTransactionsUrl","txs","stringifiedParam","_","v","urlParam","signAndSendTransactionsPopUp","txsHashes","hash","signAndSendTransaction","error","signAndSendTransactions","transactionsWS","setupMessageHandler","resolve","reject","childWindow","callback","event","origin","walletBaseUrl","screenWidth","screenHeight","left","top","messageHandler","intervalId","createBitteWalletConnector","params","result","transactions","resolveWalletUrl","setupWalletState","BitteWallet","metadata","options","store","logger","getAccounts","sgnState","signerId","contract","signedAccountId","setupBitteWallet","iconUrl","deprecated","moduleOptions"],"mappings":"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","file":"index.js","sourcesContent":["export const icon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTUiIGhlaWdodD0iOTUiIHZpZXdCb3g9IjAgMCA5NSA5NSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xLjc3NjE3IDU5LjE4MjZMNjIuNzIyNyA2My4zMTNDNjMuMTE4NSA2My40MzA5IDYzLjQ3ODggNjMuNjQ1NiA2My43NzA4IDYzLjkzNzdDNjQuMDYyOSA2NC4yMjk3IDY0LjI3NzUgNjQuNTg5OSA2NC4zOTU0IDY0Ljk4NThMNjguNTI1OSA3OC44NTU1QzY4LjY3ODcgNzkuMzY4NiA2OC45OTMyIDc5LjgxODYgNjkuNDIyNCA4MC4xMzg3QzY5Ljg1MTYgODAuNDU4NyA3MC4zNzI3IDgwLjYzMTYgNzAuOTA4MiA4MC42MzE2QzcxLjQ0MzYgODAuNjMxNiA3MS45NjQ3IDgwLjQ1ODcgNzIuMzkzOSA4MC4xMzg3QzcyLjgyMzEgNzkuODE4NiA3My4xMzc2IDc5LjM2ODYgNzMuMjkwNCA3OC44NTU1TDc3LjQyMDkgNjQuOTg1OEM3Ny41Mzg4IDY0LjU4OTkgNzcuNzUzNCA2NC4yMjk3IDc4LjA0NTUgNjMuOTM3N0M3OC4zMzc2IDYzLjY0NTYgNzguNjk3OCA2My40MzA5IDc5LjA5MzYgNjMuMzEzTDkyLjk2MzMgNTkuMTgyNkM5My40NzY0IDU5LjAyOTcgOTMuOTI2NSA1OC43MTUzIDk0LjI0NjYgNTguMjg2MUM5NC41NjY2IDU3Ljg1NjggOTQuNzM5NSA1Ny4zMzU3IDk0LjczOTUgNTYuODAwM0M5NC43Mzk1IDU2LjI2NDkgOTQuNTY2NiA1NS43NDM4IDk0LjI0NjYgNTUuMzE0NkM5My45MjY1IDU0Ljg4NTMgOTMuNDc2NCA1NC41NzA5IDkyLjk2MzMgNTQuNDE4MUw3OS4wOTM3IDUwLjI4NzZDNzguNjk3OCA1MC4xNjk3IDc4LjMzNzYgNDkuOTU1IDc4LjA0NTUgNDkuNjYzQzc3Ljc1MzUgNDkuMzcwOSA3Ny41Mzg4IDQ5LjAxMDcgNzcuNDIwOSA0OC42MTQ4TDczLjI5MDQgMzQuNzQ1MkM3My4xMzc2IDM0LjIzMiA3Mi44MjMyIDMzLjc4MTkgNzIuMzkzOSAzMy40NjE5QzcxLjk2NDcgMzMuMTQxOSA3MS40NDM2IDMyLjk2OSA3MC45MDgyIDMyLjk2OUM3MC4zNzI4IDMyLjk2OSA2OS44NTE3IDMzLjE0MTkgNjkuNDIyNCAzMy40NjE5QzY4Ljk5MzIgMzMuNzgxOSA2OC42Nzg4IDM0LjIzMiA2OC41MjYgMzQuNzQ1Mkw2NC4zOTU0IDQ4LjYxNDhDNjQuMjc3NiA0OS4wMTA3IDY0LjA2MjkgNDkuMzcwOSA2My43NzA4IDQ5LjY2M0M2My40Nzg4IDQ5Ljk1NSA2My4xMTg1IDUwLjE2OTcgNjIuNzIyNyA1MC4yODc2TDEuNzc2MTggNTQuNDE4MUMxLjI2MzA1IDU0LjU3MDkgMC44MTI5NTYgNTQuODg1MyAwLjQ5MjkyIDU1LjMxNDZDMC4xNzI4ODQgNTUuNzQzOCAyLjI0NzU1ZS0wNiA1Ni4yNjQ5IDAgNTYuODAwM0MtMi4yNDc1MWUtMDYgNTcuMzM1NyAwLjE3Mjg4NyA1Ny44NTY4IDAuNDkyOTIgNTguMjg2MUMwLjgxMjk1MyA1OC43MTUzIDEuMjYzMDMgNTkuMDI5NyAxLjc3NjE3IDU5LjE4MjZaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMyLjE2MzcgMjkuNDg2OEw0MC4zNTc4IDMxLjkyNzFDNDAuNTkxNyAzMS45OTY3IDQwLjgwNDUgMzIuMTIzNiA0MC45NzcgMzIuMjk2MUM0MS4xNDk2IDMyLjQ2ODcgNDEuMjc2NCAzMi42ODE1IDQxLjM0NjEgMzIuOTE1NEw0My43ODYzIDQxLjEwOTVDNDMuODc2NiA0MS40MTI2IDQ0LjA2MjQgNDEuNjc4NSA0NC4zMTYgNDEuODY3NkM0NC41Njk2IDQyLjA1NjcgNDQuODc3NCA0Mi4xNTg4IDQ1LjE5MzcgNDIuMTU4OEM0NS41MTAxIDQyLjE1ODggNDUuODE3OSA0Mi4wNTY3IDQ2LjA3MTUgNDEuODY3NkM0Ni4zMjUxIDQxLjY3ODUgNDYuNTEwOSA0MS40MTI2IDQ2LjYwMTEgNDEuMTA5NUw0OS4wNDE0IDMyLjkxNTRDNDkuMTExMSAzMi42ODE1IDQ5LjIzNzkgMzIuNDY4NyA0OS40MTA0IDMyLjI5NjFDNDkuNTgzIDMyLjEyMzYgNDkuNzk1OCAzMS45OTY3IDUwLjAyOTcgMzEuOTI3MUw1OC4yMjM4IDI5LjQ4NjhDNTguNTI2OSAyOS4zOTY2IDU4Ljc5MjggMjkuMjEwOCA1OC45ODE5IDI4Ljk1NzJDNTkuMTcxIDI4LjcwMzYgNTkuMjczMSAyOC4zOTU4IDU5LjI3MzEgMjguMDc5NEM1OS4yNzMxIDI3Ljc2MzEgNTkuMTcxIDI3LjQ1NTMgNTguOTgxOSAyNy4yMDE3QzU4Ljc5MjggMjYuOTQ4MSA1OC41MjY5IDI2Ljc2MjMgNTguMjIzOCAyNi42NzJMNTAuMDI5NiAyNC4yMzE3QzQ5Ljc5NTggMjQuMTYyMSA0OS41ODI5IDI0LjAzNTIgNDkuNDEwNCAyMy44NjI3QzQ5LjIzNzkgMjMuNjkwMiA0OS4xMTEgMjMuNDc3MyA0OS4wNDE0IDIzLjI0MzRMNDYuNjAxMSAxNS4wNDkzQzQ2LjUxMDggMTQuNzQ2MiA0Ni4zMjUgMTQuNDgwMyA0Ni4wNzE1IDE0LjI5MTJDNDUuODE3OSAxNC4xMDIxIDQ1LjUxIDE0IDQ1LjE5MzcgMTRDNDQuODc3NCAxNCA0NC41Njk1IDE0LjEwMjEgNDQuMzE1OSAxNC4yOTEyQzQ0LjA2MjMgMTQuNDgwMyA0My44NzY2IDE0Ljc0NjIgNDMuNzg2MyAxNS4wNDkzTDQxLjM0NiAyMy4yNDM0QzQxLjI3NjQgMjMuNDc3MyA0MS4xNDk1IDIzLjY5MDIgNDAuOTc3IDIzLjg2MjdDNDAuODA0NCAyNC4wMzUyIDQwLjU5MTYgMjQuMTYyMSA0MC4zNTc4IDI0LjIzMTdMMzIuMTYzNyAyNi42NzJDMzEuODYwNSAyNi43NjIyIDMxLjU5NDYgMjYuOTQ4IDMxLjQwNTUgMjcuMjAxNkMzMS4yMTY0IDI3LjQ1NTIgMzEuMTE0MyAyNy43NjMxIDMxLjExNDMgMjguMDc5NEMzMS4xMTQzIDI4LjM5NTggMzEuMjE2NCAyOC43MDM3IDMxLjQwNTUgMjguOTU3MkMzMS41OTQ2IDI5LjIxMDggMzEuODYwNSAyOS4zOTY2IDMyLjE2MzcgMjkuNDg2OFoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=';\n","import type {\n Action,\n FinalExecutionOutcome,\n Network,\n SignMessageParams,\n Transaction,\n} from \"@near-wallet-selector/core\";\nimport { createAction } from \"@near-wallet-selector/wallet-utils\";\nimport { connect, keyStores, providers } from \"near-api-js\";\nimport type { PublicKey } from \"near-api-js/lib/utils/index.js\";\nimport { KeyPair } from \"near-api-js/lib/utils/index.js\";\nimport { WalletConfig, WalletMessage, WalletResponseData, WalletState } from \"./types\";\n\n\n// Constants\nconst DEFAULT_POPUP_WIDTH = 480;\nconst DEFAULT_POPUP_HEIGHT = 640;\nconst POLL_INTERVAL = 300;\n\n\n// State management\nconst getInitialState = (): WalletState => ({\n signedAccountId: localStorage.getItem(\"bitte:signedAccountId\") || \"\",\n functionCallKey: JSON.parse(localStorage.getItem(\"bitte:functionCallKey\") || \"null\"),\n});\n\nconst saveState = (state: WalletState): void => {\n localStorage.setItem(\"bitte:signedAccountId\", state.signedAccountId);\n localStorage.setItem(\"bitte:functionCallKey\", JSON.stringify(state.functionCallKey));\n};\n\n// Create wallet configuration\nconst createWalletConfig = (walletUrl: string, network: Network): WalletConfig => ({\n walletUrl,\n network,\n provider: new providers.JsonRpcProvider({ url: network.nodeUrl }),\n});\n\n// Core functions\nconst getAccountId = (state: WalletState): string => {\n return state.signedAccountId;\n};\n\nconst getPublicKey = (state: WalletState): PublicKey | undefined => {\n if (state.functionCallKey) {\n return KeyPair.fromString(state.functionCallKey.privateKey as any).getPublicKey();\n }\n return undefined;\n};\n\nconst isSignedIn = (state: WalletState): boolean => {\n return !!state.signedAccountId;\n};\n\nconst signOut = (): WalletState => {\n const newState = {\n signedAccountId: \"\",\n functionCallKey: null,\n };\n saveState(newState);\n return newState;\n};\n\nconst requestSignInUrl = (\n config: WalletConfig,\n { contractId, methodNames }: { contractId: string; methodNames?: Array }\n): { url: string; newState: WalletState } => {\n const currentUrl = new URL(window.location.href);\n const newUrl = new URL(`${config.walletUrl}/login/`);\n\n newUrl.searchParams.set(\"success_url\", currentUrl.href);\n newUrl.searchParams.set(\"failure_url\", currentUrl.href);\n\n let functionCallKey = null;\n\n if (contractId) {\n newUrl.searchParams.set(\"contract_id\", contractId);\n\n const accessKey = KeyPair.fromRandom(\"ed25519\");\n newUrl.searchParams.set(\n \"public_key\",\n accessKey.getPublicKey().toString()\n );\n\n functionCallKey = {\n privateKey: accessKey.toString(),\n contractId,\n methods: methodNames || [],\n };\n }\n\n if (methodNames) {\n methodNames.forEach((methodName) => {\n newUrl.searchParams.append(\"methodNames\", methodName);\n });\n }\n\n const newState = getInitialState();\n newState.functionCallKey = functionCallKey;\n saveState(newState);\n\n return { url: newUrl.toString(), newState };\n};\n\nconst requestSignIn = async (\n config: WalletConfig,\n state: WalletState,\n { contractId, methodNames }: { contractId: string; methodNames?: Array }\n): Promise> => {\n const { url, newState } = requestSignInUrl(config, { contractId, methodNames });\n\n return handlePopupTransaction(config, url, async (data) => {\n const responseData = data as WalletResponseData;\n const { public_key: publicKey, account_id: accountId } = responseData;\n\n if (accountId) {\n const updatedState = { ...newState, signedAccountId: accountId };\n saveState(updatedState);\n return [{ accountId, publicKey: publicKey || \"\" }];\n }\n throw new Error(\"Invalid response data from wallet\");\n });\n};\n\nconst signMessage = async (\n config: WalletConfig,\n { message, nonce, recipient, callbackUrl, state: messageState }: SignMessageParams\n) => {\n const url = callbackUrl || window.location.href;\n\n if (!url) {\n throw new Error(`BitteWallet: CallbackUrl is missing`);\n }\n\n const href = new URL(config.walletUrl);\n href.pathname = \"sign-message\";\n href.searchParams.append(\"message\", message);\n href.searchParams.append(\"nonce\", nonce.toString(\"base64\"));\n href.searchParams.append(\"recipient\", recipient);\n href.searchParams.append(\"callbackUrl\", url);\n\n if (messageState) {\n href.searchParams.append(\"state\", messageState);\n }\n\n return handlePopupTransaction(config, href.toString(), (value) => {\n return {\n accountId: value?.signedRequest?.accountId || \"\",\n publicKey: value?.signedRequest?.publicKey || \"\",\n signature: value?.signedRequest?.signature || \"\",\n };\n });\n};\n\nconst storedKeyCanSign = (\n state: WalletState,\n receiverId: string,\n actions: Array\n): boolean => {\n if (\n state.functionCallKey &&\n state.functionCallKey.contractId === receiverId\n ) {\n return (\n actions[0].type === \"FunctionCall\" &&\n actions[0].params.deposit === \"0\" &&\n (state.functionCallKey.methods.length === 0 ||\n state.functionCallKey.methods.includes(actions[0].params.methodName))\n );\n }\n return false;\n};\n\nconst signUsingKeyPair = async (\n config: WalletConfig,\n state: WalletState,\n { receiverId, actions }: { receiverId: string; actions: Array }\n): Promise => {\n // instantiate an account (NEAR API is a nightmare)\n const myKeyStore = new keyStores.InMemoryKeyStore();\n const keyPair = KeyPair.fromString(state.functionCallKey!.privateKey as any);\n\n await myKeyStore.setKey(\n config.network.networkId,\n state.signedAccountId,\n keyPair\n );\n\n const near = await connect({ ...config.network, keyStore: myKeyStore });\n const account = await near.account(state.signedAccountId);\n\n return account.signAndSendTransaction({\n receiverId,\n actions: actions.map((a) => createAction(a)),\n });\n};\n\nconst requestSignTransactionsUrl = (\n config: WalletConfig,\n txs: Array\n): string => {\n const newUrl = new URL(`${config.walletUrl}/sign-transaction`);\n const stringifiedParam = JSON.stringify(txs, (_, v) => typeof v === 'bigint' ? v.toString() : v);\n const urlParam = encodeURIComponent(stringifiedParam);\n\n newUrl.searchParams.set('transactions_data', urlParam);\n newUrl.searchParams.set('callback_url', window.location.origin);\n\n return newUrl.toString();\n};\n\nconst signAndSendTransactionsPopUp = async (\n config: WalletConfig,\n txs: Array\n): Promise> => {\n const url = requestSignTransactionsUrl(config, txs);\n const txsHashes = (\n await handlePopupTransaction(config, url, (data) => data.transactionHashes)\n )?.split(\",\");\n\n if (!txsHashes) {\n throw new Error(\"No transaction hashes received\");\n }\n return Promise.all(\n txsHashes.map((hash) => config.provider.txStatus(hash, \"unused\"))\n );\n};\n\n\n\nconst signAndSendTransaction = async (\n config: WalletConfig,\n state: WalletState,\n { receiverId, actions }: { receiverId: string; actions: Array }\n): Promise => {\n if (actions.length === 1 && storedKeyCanSign(state, receiverId, actions)) {\n try {\n return await signUsingKeyPair(config, state, { receiverId, actions });\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\n \"Failed to sign using key pair, falling back to wallet\",\n error\n );\n }\n }\n\n const results = await signAndSendTransactionsPopUp(config, [{ signerId: state.signedAccountId, receiverId, actions }]);\n return results[0];\n};\n\nconst signAndSendTransactions = async (\n config: WalletConfig,\n state: WalletState,\n transactionsWS: Array\n): Promise> => {\n\n return signAndSendTransactionsPopUp(config, transactionsWS);\n};\n\n// Helper functions\nconst setupMessageHandler = (\n config: WalletConfig,\n resolve: (value: T) => void,\n reject: (reason?: unknown) => void,\n childWindow: Window | null,\n callback: (result: WalletMessage) => T\n): (event: MessageEvent) => Promise => {\n const handler = async (event: MessageEvent) => {\n const message = event.data as WalletMessage;\n\n // check if the URL are the same\n const origin = new URL(event.origin);\n const walletBaseUrl = new URL(config.walletUrl);\n\n if (origin.origin !== walletBaseUrl.origin) {\n // eslint-disable-next-line no-console\n console.warn(\"Ignoring message from different origin\", origin.origin);\n return;\n }\n\n switch (message.status) {\n case \"success\":\n childWindow?.close();\n resolve(callback(message));\n break;\n case \"failure\":\n childWindow?.close();\n reject(new Error(message.errorMessage || \"Transaction failed\"));\n break;\n default:\n // eslint-disable-next-line no-console\n console.warn(\"Unhandled message status:\", message.status);\n }\n };\n\n return handler;\n};\n\nconst handlePopupTransaction = (\n config: WalletConfig,\n url: string,\n callback: (result: WalletMessage) => T\n): Promise => {\n const screenWidth = window.innerWidth || screen.width;\n const screenHeight = window.innerHeight || screen.height;\n const left = (screenWidth - DEFAULT_POPUP_WIDTH) / 2;\n const top = (screenHeight - DEFAULT_POPUP_HEIGHT) / 2;\n\n const childWindow = window.open(\n url,\n \"BitteWallet\",\n `width=${DEFAULT_POPUP_WIDTH},height=${DEFAULT_POPUP_HEIGHT},top=${top},left=${left}`\n );\n\n if (!childWindow) {\n throw new Error(\n \"Popup window blocked. Please allow popups for this site.\"\n );\n }\n\n return new Promise((resolve, reject) => {\n const messageHandler = setupMessageHandler(\n config,\n resolve,\n reject,\n childWindow,\n callback\n );\n\n window.addEventListener(\"message\", messageHandler);\n\n const intervalId = setInterval(() => {\n if (childWindow.closed) {\n window.removeEventListener(\"message\", messageHandler);\n clearInterval(intervalId);\n reject(new Error(\"User closed the window\"));\n }\n }, POLL_INTERVAL);\n });\n};\n\n\nexport const createBitteWalletConnector = (walletUrl: string, network: Network) => {\n const config = createWalletConfig(walletUrl, network);\n let state = getInitialState();\n\n return {\n getAccountId: () => getAccountId(state),\n getPublicKey: () => getPublicKey(state),\n isSignedIn: () => isSignedIn(state),\n signOut: () => {\n state = signOut();\n return null;\n },\n requestSignIn: async (params: { contractId: string; methodNames?: Array }) => {\n const result = await requestSignIn(config, state, params);\n // Update state after sign-in\n state = getInitialState();\n return result;\n },\n requestSignInUrl: (params: { contractId: string; methodNames?: Array }) => {\n const { url, newState } = requestSignInUrl(config, params);\n state = newState;\n return url;\n },\n signMessage: (params: SignMessageParams) => signMessage(config, params),\n signAndSendTransaction: (params: { receiverId: string; actions: Array }) =>\n signAndSendTransaction(config, state, params),\n signAndSendTransactions: (transactions: Array) =>\n signAndSendTransactions(config, state, transactions),\n };\n};","import type {\n WalletModuleFactory,\n WalletBehaviourFactory,\n Transaction,\n Network,\n Account,\n InjectedWallet,\n} from \"@near-wallet-selector/core\";\nimport { icon } from \"./icon\";\nimport { createBitteWalletConnector } from \"./bitte-wallet\";\nimport { BitteWalletExtraOptions, BitteWalletParams, BitteWalletState } from \"./types\";\n\nconst resolveWalletUrl = (network?: Network, walletUrl?: string) => {\n if (walletUrl) {\n return walletUrl;\n }\n\n if(!network){\n return \"https://wallet.bitte.ai\";\n }\n\n switch (network.networkId) {\n case \"mainnet\":\n return \"https://wallet.bitte.ai\";\n case \"testnet\":\n return \"https://testnet.wallet.bitte.ai\";\n default:\n return \"https://wallet.bitte.ai\";\n }\n};\n\nconst setupWalletState = async (\n params: BitteWalletExtraOptions,\n network: Network\n): Promise => {\n // Use the factory function instead of the class constructor\n const wallet = createBitteWalletConnector(params.walletUrl, network);\n\n return {\n wallet,\n };\n};\n\nconst BitteWallet: WalletBehaviourFactory<\n InjectedWallet,\n { params: BitteWalletExtraOptions }\n> = async ({ metadata, options, store, params, logger }) => {\n const state = await setupWalletState(params, options.network);\n\n const getAccounts = async (): Promise> => {\n const accountId = state.wallet.getAccountId();\n const publicKey = state.wallet.getPublicKey();\n\n return [\n {\n accountId,\n publicKey: publicKey ? publicKey.toString() : \"\",\n },\n ];\n };\n\n return {\n async signIn({ contractId, methodNames }) {\n if (!state.wallet.isSignedIn()) {\n await state.wallet.requestSignIn({\n contractId,\n methodNames,\n });\n }\n\n return getAccounts();\n },\n\n async signOut() {\n state.wallet.signOut();\n },\n\n async getAccounts() {\n return getAccounts();\n },\n\n async verifyOwner() {\n throw new Error(`Method not supported by ${metadata.name}`);\n },\n\n async signMessage({\n message,\n nonce,\n recipient,\n callbackUrl,\n state: sgnState,\n }) {\n logger.log(\"sign message\", { message });\n\n return await state.wallet.signMessage({\n message,\n nonce,\n recipient,\n callbackUrl,\n state: sgnState,\n });\n },\n\n async signAndSendTransaction({ signerId, receiverId, actions }) {\n logger.log(\"signAndSendTransaction\", {\n signerId,\n receiverId,\n actions,\n });\n\n const { contract } = store.getState();\n\n if (!state.wallet.isSignedIn() || !contract) {\n throw new Error(\"Wallet not signed in\");\n }\n\n const signedAccountId = state.wallet.getAccountId();\n\n if (signerId && signedAccountId !== signerId) {\n throw new Error(\n `Signed in as ${signedAccountId}, cannot sign for ${signerId}`\n );\n }\n\n return state.wallet.signAndSendTransaction({\n receiverId: receiverId || contract.contractId,\n actions,\n });\n },\n\n async signAndSendTransactions({ transactions }) {\n logger.log(\"signAndSendTransactions\", { transactions });\n\n if (!state.wallet.isSignedIn()) {\n throw new Error(\"Wallet not signed in\");\n }\n\n return state.wallet.signAndSendTransactions(\n transactions as Array\n );\n },\n\n buildImportAccountsUrl() {\n return `${params.walletUrl}/batch-import`;\n },\n };\n};\n\nexport function setupBitteWallet({\n walletUrl,\n iconUrl = icon,\n deprecated = false,\n}: BitteWalletParams = {}): WalletModuleFactory {\n return async (moduleOptions) => {\n return {\n id: \"bitte-wallet\",\n type: \"injected\",\n metadata: {\n name: \"Bitte Wallet\",\n description:\n \"NEAR wallet to store, buy, send and stake assets for DeFi.\",\n iconUrl,\n deprecated,\n available: true,\n downloadUrl: resolveWalletUrl(moduleOptions.options.network, walletUrl),\n },\n init: (options) => {\n return BitteWallet({\n ...options,\n params: {\n walletUrl: resolveWalletUrl(moduleOptions.options.network, walletUrl),\n },\n });\n },\n };\n };\n}"]} \ No newline at end of file diff --git a/dist/index.mjs b/dist/index.mjs deleted file mode 100644 index 1f7e732..0000000 --- a/dist/index.mjs +++ /dev/null @@ -1,3 +0,0 @@ -import {createAction}from'@near-wallet-selector/wallet-utils';import {providers,keyStores,connect}from'near-api-js';import {KeyPair}from'near-api-js/lib/utils/index.js';var j="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTUiIGhlaWdodD0iOTUiIHZpZXdCb3g9IjAgMCA5NSA5NSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xLjc3NjE3IDU5LjE4MjZMNjIuNzIyNyA2My4zMTNDNjMuMTE4NSA2My40MzA5IDYzLjQ3ODggNjMuNjQ1NiA2My43NzA4IDYzLjkzNzdDNjQuMDYyOSA2NC4yMjk3IDY0LjI3NzUgNjQuNTg5OSA2NC4zOTU0IDY0Ljk4NThMNjguNTI1OSA3OC44NTU1QzY4LjY3ODcgNzkuMzY4NiA2OC45OTMyIDc5LjgxODYgNjkuNDIyNCA4MC4xMzg3QzY5Ljg1MTYgODAuNDU4NyA3MC4zNzI3IDgwLjYzMTYgNzAuOTA4MiA4MC42MzE2QzcxLjQ0MzYgODAuNjMxNiA3MS45NjQ3IDgwLjQ1ODcgNzIuMzkzOSA4MC4xMzg3QzcyLjgyMzEgNzkuODE4NiA3My4xMzc2IDc5LjM2ODYgNzMuMjkwNCA3OC44NTU1TDc3LjQyMDkgNjQuOTg1OEM3Ny41Mzg4IDY0LjU4OTkgNzcuNzUzNCA2NC4yMjk3IDc4LjA0NTUgNjMuOTM3N0M3OC4zMzc2IDYzLjY0NTYgNzguNjk3OCA2My40MzA5IDc5LjA5MzYgNjMuMzEzTDkyLjk2MzMgNTkuMTgyNkM5My40NzY0IDU5LjAyOTcgOTMuOTI2NSA1OC43MTUzIDk0LjI0NjYgNTguMjg2MUM5NC41NjY2IDU3Ljg1NjggOTQuNzM5NSA1Ny4zMzU3IDk0LjczOTUgNTYuODAwM0M5NC43Mzk1IDU2LjI2NDkgOTQuNTY2NiA1NS43NDM4IDk0LjI0NjYgNTUuMzE0NkM5My45MjY1IDU0Ljg4NTMgOTMuNDc2NCA1NC41NzA5IDkyLjk2MzMgNTQuNDE4MUw3OS4wOTM3IDUwLjI4NzZDNzguNjk3OCA1MC4xNjk3IDc4LjMzNzYgNDkuOTU1IDc4LjA0NTUgNDkuNjYzQzc3Ljc1MzUgNDkuMzcwOSA3Ny41Mzg4IDQ5LjAxMDcgNzcuNDIwOSA0OC42MTQ4TDczLjI5MDQgMzQuNzQ1MkM3My4xMzc2IDM0LjIzMiA3Mi44MjMyIDMzLjc4MTkgNzIuMzkzOSAzMy40NjE5QzcxLjk2NDcgMzMuMTQxOSA3MS40NDM2IDMyLjk2OSA3MC45MDgyIDMyLjk2OUM3MC4zNzI4IDMyLjk2OSA2OS44NTE3IDMzLjE0MTkgNjkuNDIyNCAzMy40NjE5QzY4Ljk5MzIgMzMuNzgxOSA2OC42Nzg4IDM0LjIzMiA2OC41MjYgMzQuNzQ1Mkw2NC4zOTU0IDQ4LjYxNDhDNjQuMjc3NiA0OS4wMTA3IDY0LjA2MjkgNDkuMzcwOSA2My43NzA4IDQ5LjY2M0M2My40Nzg4IDQ5Ljk1NSA2My4xMTg1IDUwLjE2OTcgNjIuNzIyNyA1MC4yODc2TDEuNzc2MTggNTQuNDE4MUMxLjI2MzA1IDU0LjU3MDkgMC44MTI5NTYgNTQuODg1MyAwLjQ5MjkyIDU1LjMxNDZDMC4xNzI4ODQgNTUuNzQzOCAyLjI0NzU1ZS0wNiA1Ni4yNjQ5IDAgNTYuODAwM0MtMi4yNDc1MWUtMDYgNTcuMzM1NyAwLjE3Mjg4NyA1Ny44NTY4IDAuNDkyOTIgNTguMjg2MUMwLjgxMjk1MyA1OC43MTUzIDEuMjYzMDMgNTkuMDI5NyAxLjc3NjE3IDU5LjE4MjZaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMyLjE2MzcgMjkuNDg2OEw0MC4zNTc4IDMxLjkyNzFDNDAuNTkxNyAzMS45OTY3IDQwLjgwNDUgMzIuMTIzNiA0MC45NzcgMzIuMjk2MUM0MS4xNDk2IDMyLjQ2ODcgNDEuMjc2NCAzMi42ODE1IDQxLjM0NjEgMzIuOTE1NEw0My43ODYzIDQxLjEwOTVDNDMuODc2NiA0MS40MTI2IDQ0LjA2MjQgNDEuNjc4NSA0NC4zMTYgNDEuODY3NkM0NC41Njk2IDQyLjA1NjcgNDQuODc3NCA0Mi4xNTg4IDQ1LjE5MzcgNDIuMTU4OEM0NS41MTAxIDQyLjE1ODggNDUuODE3OSA0Mi4wNTY3IDQ2LjA3MTUgNDEuODY3NkM0Ni4zMjUxIDQxLjY3ODUgNDYuNTEwOSA0MS40MTI2IDQ2LjYwMTEgNDEuMTA5NUw0OS4wNDE0IDMyLjkxNTRDNDkuMTExMSAzMi42ODE1IDQ5LjIzNzkgMzIuNDY4NyA0OS40MTA0IDMyLjI5NjFDNDkuNTgzIDMyLjEyMzYgNDkuNzk1OCAzMS45OTY3IDUwLjAyOTcgMzEuOTI3MUw1OC4yMjM4IDI5LjQ4NjhDNTguNTI2OSAyOS4zOTY2IDU4Ljc5MjggMjkuMjEwOCA1OC45ODE5IDI4Ljk1NzJDNTkuMTcxIDI4LjcwMzYgNTkuMjczMSAyOC4zOTU4IDU5LjI3MzEgMjguMDc5NEM1OS4yNzMxIDI3Ljc2MzEgNTkuMTcxIDI3LjQ1NTMgNTguOTgxOSAyNy4yMDE3QzU4Ljc5MjggMjYuOTQ4MSA1OC41MjY5IDI2Ljc2MjMgNTguMjIzOCAyNi42NzJMNTAuMDI5NiAyNC4yMzE3QzQ5Ljc5NTggMjQuMTYyMSA0OS41ODI5IDI0LjAzNTIgNDkuNDEwNCAyMy44NjI3QzQ5LjIzNzkgMjMuNjkwMiA0OS4xMTEgMjMuNDc3MyA0OS4wNDE0IDIzLjI0MzRMNDYuNjAxMSAxNS4wNDkzQzQ2LjUxMDggMTQuNzQ2MiA0Ni4zMjUgMTQuNDgwMyA0Ni4wNzE1IDE0LjI5MTJDNDUuODE3OSAxNC4xMDIxIDQ1LjUxIDE0IDQ1LjE5MzcgMTRDNDQuODc3NCAxNCA0NC41Njk1IDE0LjEwMjEgNDQuMzE1OSAxNC4yOTEyQzQ0LjA2MjMgMTQuNDgwMyA0My44NzY2IDE0Ljc0NjIgNDMuNzg2MyAxNS4wNDkzTDQxLjM0NiAyMy4yNDM0QzQxLjI3NjQgMjMuNDc3MyA0MS4xNDk1IDIzLjY5MDIgNDAuOTc3IDIzLjg2MjdDNDAuODA0NCAyNC4wMzUyIDQwLjU5MTYgMjQuMTYyMSA0MC4zNTc4IDI0LjIzMTdMMzIuMTYzNyAyNi42NzJDMzEuODYwNSAyNi43NjIyIDMxLjU5NDYgMjYuOTQ4IDMxLjQwNTUgMjcuMjAxNkMzMS4yMTY0IDI3LjQ1NTIgMzEuMTE0MyAyNy43NjMxIDMxLjExNDMgMjguMDc5NEMzMS4xMTQzIDI4LjM5NTggMzEuMjE2NCAyOC43MDM3IDMxLjQwNTUgMjguOTU3MkMzMS41OTQ2IDI5LjIxMDggMzEuODYwNSAyOS4zOTY2IDMyLjE2MzcgMjkuNDg2OFoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=";var y=480,A=640,k=300,N=()=>({signedAccountId:localStorage.getItem("bitte:signedAccountId")||"",functionCallKey:JSON.parse(localStorage.getItem("bitte:functionCallKey")||"null")}),I=t=>{localStorage.setItem("bitte:signedAccountId",t.signedAccountId),localStorage.setItem("bitte:functionCallKey",JSON.stringify(t.functionCallKey));},E=(t,a)=>({walletUrl:t,network:a,provider:new providers.JsonRpcProvider({url:a.nodeUrl})}),C=t=>t.signedAccountId,p=t=>{if(t.functionCallKey)return KeyPair.fromString(t.functionCallKey.privateKey).getPublicKey()},U=t=>!!t.signedAccountId,Q=()=>{let t={signedAccountId:"",functionCallKey:null};return I(t),t},d=(t,{contractId:a,methodNames:e})=>{let r=new URL(window.location.href),n=new URL(`${t.walletUrl}/login/`);n.searchParams.set("success_url",r.href),n.searchParams.set("failure_url",r.href);let i=null;if(a){n.searchParams.set("contract_id",a);let s=KeyPair.fromRandom("ed25519");n.searchParams.set("public_key",s.getPublicKey().toString()),i={privateKey:s.toString(),contractId:a,methods:e||[]};}e&&e.forEach(s=>{n.searchParams.append("methodNames",s);});let o=N();return o.functionCallKey=i,I(o),{url:n.toString(),newState:o}},f=async(t,a,{contractId:e,methodNames:r})=>{let{url:n,newState:i}=d(t,{contractId:e,methodNames:r});return D(t,n,async o=>{let s=o,{public_key:c,account_id:l}=s;if(l){let M={...i,signedAccountId:l};return I(M),[{accountId:l,publicKey:c||""}]}throw new Error("Invalid response data from wallet")})},x=async(t,{message:a,nonce:e,recipient:r,callbackUrl:n,state:i})=>{let o=n||window.location.href;if(!o)throw new Error("BitteWallet: CallbackUrl is missing");let s=new URL(t.walletUrl);return s.pathname="sign-message",s.searchParams.append("message",a),s.searchParams.append("nonce",e.toString("base64")),s.searchParams.append("recipient",r),s.searchParams.append("callbackUrl",o),i&&s.searchParams.append("state",i),D(t,s.toString(),c=>({accountId:c?.signedRequest?.accountId||"",publicKey:c?.signedRequest?.publicKey||"",signature:c?.signedRequest?.signature||""}))},h=(t,a,e)=>t.functionCallKey&&t.functionCallKey.contractId===a?e[0].type==="FunctionCall"&&e[0].params.deposit==="0"&&(t.functionCallKey.methods.length===0||t.functionCallKey.methods.includes(e[0].params.methodName)):false,W=async(t,a,{receiverId:e,actions:r})=>{let n=new keyStores.InMemoryKeyStore,i=KeyPair.fromString(a.functionCallKey.privateKey);return await n.setKey(t.network.networkId,a.signedAccountId,i),(await(await connect({...t.network,keyStore:n})).account(a.signedAccountId)).signAndSendTransaction({receiverId:e,actions:r.map(c=>createAction(c))})},Y=(t,a)=>{let e=new URL(`${t.walletUrl}/sign-transaction`),r=JSON.stringify(a,(i,o)=>typeof o=="bigint"?o.toString():o),n=encodeURIComponent(r);return e.searchParams.set("transactions_data",n),e.searchParams.set("callback_url",window.location.origin),e.toString()},z=async(t,a)=>{let e=Y(t,a),r=(await D(t,e,n=>n.transactionHashes))?.split(",");if(!r)throw new Error("No transaction hashes received");return Promise.all(r.map(n=>t.provider.txStatus(n,"unused")))},P=async(t,a,{receiverId:e,actions:r})=>{if(r.length===1&&h(a,e,r))try{return await W(t,a,{receiverId:e,actions:r})}catch(i){console.warn("Failed to sign using key pair, falling back to wallet",i);}return (await z(t,[{signerId:a.signedAccountId,receiverId:e,actions:r}]))[0]},b=async(t,a,e)=>z(t,e),K=(t,a,e,r,n)=>async o=>{let s=o.data,c=new URL(o.origin),l=new URL(t.walletUrl);if(c.origin!==l.origin){console.warn("Ignoring message from different origin",c.origin);return}switch(s.status){case "success":r?.close(),a(n(s));break;case "failure":r?.close(),e(new Error(s.errorMessage||"Transaction failed"));break;default:console.warn("Unhandled message status:",s.status);}},D=(t,a,e)=>{let r=window.innerWidth||screen.width,n=window.innerHeight||screen.height,i=(r-y)/2,o=(n-A)/2,s=window.open(a,"BitteWallet",`width=${y},height=${A},top=${o},left=${i}`);if(!s)throw new Error("Popup window blocked. Please allow popups for this site.");return new Promise((c,l)=>{let M=K(t,c,l,s,e);window.addEventListener("message",M);let g=setInterval(()=>{s.closed&&(window.removeEventListener("message",M),clearInterval(g),l(new Error("User closed the window")));},k);})},T=(t,a)=>{let e=E(t,a),r=N();return {getAccountId:()=>C(r),getPublicKey:()=>p(r),isSignedIn:()=>U(r),signOut:()=>(r=Q(),null),requestSignIn:async n=>{let i=await f(e,r,n);return r=N(),i},requestSignInUrl:n=>{let{url:i,newState:o}=d(e,n);return r=o,i},signMessage:n=>x(e,n),signAndSendTransaction:n=>P(e,r,n),signAndSendTransactions:n=>b(e,r,n)}};var w=(t,a)=>{if(a)return a;if(!t)return "https://wallet.bitte.ai";switch(t.networkId){case "mainnet":return "https://wallet.bitte.ai";case "testnet":return "https://testnet.wallet.bitte.ai";default:return "https://wallet.bitte.ai"}},v=async(t,a)=>({wallet:T(t.walletUrl,a)}),B=async({metadata:t,options:a,store:e,params:r,logger:n})=>{let i=await v(r,a.network),o=async()=>{let s=i.wallet.getAccountId(),c=i.wallet.getPublicKey();return [{accountId:s,publicKey:c?c.toString():""}]};return {async signIn({contractId:s,methodNames:c}){return i.wallet.isSignedIn()||await i.wallet.requestSignIn({contractId:s,methodNames:c}),o()},async signOut(){i.wallet.signOut();},async getAccounts(){return o()},async verifyOwner(){throw new Error(`Method not supported by ${t.name}`)},async signMessage({message:s,nonce:c,recipient:l,callbackUrl:M,state:g}){return n.log("sign message",{message:s}),await i.wallet.signMessage({message:s,nonce:c,recipient:l,callbackUrl:M,state:g})},async signAndSendTransaction({signerId:s,receiverId:c,actions:l}){n.log("signAndSendTransaction",{signerId:s,receiverId:c,actions:l});let{contract:M}=e.getState();if(!i.wallet.isSignedIn()||!M)throw new Error("Wallet not signed in");let g=i.wallet.getAccountId();if(s&&g!==s)throw new Error(`Signed in as ${g}, cannot sign for ${s}`);return i.wallet.signAndSendTransaction({receiverId:c||M.contractId,actions:l})},async signAndSendTransactions({transactions:s}){if(n.log("signAndSendTransactions",{transactions:s}),!i.wallet.isSignedIn())throw new Error("Wallet not signed in");return i.wallet.signAndSendTransactions(s)},buildImportAccountsUrl(){return `${r.walletUrl}/batch-import`}}};function Z({walletUrl:t,iconUrl:a=j,deprecated:e=false}={}){return async r=>({id:"bitte-wallet",type:"injected",metadata:{name:"Bitte Wallet",description:"NEAR wallet to store, buy, send and stake assets for DeFi.",iconUrl:a,deprecated:e,available:true,downloadUrl:w(r.options.network,t)},init:n=>B({...n,params:{walletUrl:w(r.options.network,t)}})})} -export{Z as setupBitteWallet};//# sourceMappingURL=index.mjs.map -//# sourceMappingURL=index.mjs.map \ No newline at end of file diff --git a/dist/index.mjs.map b/dist/index.mjs.map deleted file mode 100644 index feba949..0000000 --- a/dist/index.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["../src/icon.ts","../src/bitte-wallet.ts","../src/bitte-wallet-setup.ts"],"names":["icon","DEFAULT_POPUP_WIDTH","DEFAULT_POPUP_HEIGHT","POLL_INTERVAL","getInitialState","saveState","state","createWalletConfig","walletUrl","network","providers","getAccountId","getPublicKey","KeyPair","isSignedIn","signOut","newState","requestSignInUrl","config","contractId","methodNames","currentUrl","newUrl","functionCallKey","accessKey","methodName","requestSignIn","url","handlePopupTransaction","data","responseData","publicKey","accountId","updatedState","signMessage","message","nonce","recipient","callbackUrl","messageState","href","value","storedKeyCanSign","receiverId","actions","signUsingKeyPair","myKeyStore","keyStores","keyPair","connect","a","createAction","requestSignTransactionsUrl","txs","stringifiedParam","_","v","urlParam","signAndSendTransactionsPopUp","txsHashes","hash","signAndSendTransaction","error","signAndSendTransactions","transactionsWS","setupMessageHandler","resolve","reject","childWindow","callback","event","origin","walletBaseUrl","screenWidth","screenHeight","left","top","messageHandler","intervalId","createBitteWalletConnector","params","result","transactions","resolveWalletUrl","setupWalletState","BitteWallet","metadata","options","store","logger","getAccounts","sgnState","signerId","contract","signedAccountId","setupBitteWallet","iconUrl","deprecated","moduleOptions"],"mappings":"yKAAO,IAAMA,EAAO,4qHCOpB,CAQA,IAAMC,CAAAA,CAAsB,IACtBC,CAAuB,CAAA,GAAA,CACvBC,CAAgB,CAAA,GAAA,CAIhBC,EAAkB,KAAoB,CAC1C,eAAiB,CAAA,YAAA,CAAa,QAAQ,uBAAuB,CAAA,EAAK,GAClE,eAAiB,CAAA,IAAA,CAAK,MAAM,YAAa,CAAA,OAAA,CAAQ,uBAAuB,CAAA,EAAK,MAAM,CACrF,CAAA,CAAA,CAEMC,CAAaC,CAAAA,CAAAA,EAA6B,CAC9C,YAAa,CAAA,OAAA,CAAQ,uBAAyBA,CAAAA,CAAAA,CAAM,eAAe,CACnE,CAAA,YAAA,CAAa,QAAQ,uBAAyB,CAAA,IAAA,CAAK,UAAUA,CAAM,CAAA,eAAe,CAAC,EACrF,EAGMC,CAAqB,CAAA,CAACC,CAAmBC,CAAAA,CAAAA,IAAoC,CACjF,SAAAD,CAAAA,CAAAA,CACA,OAAAC,CAAAA,CAAAA,CACA,SAAU,IAAIC,SAAAA,CAAU,gBAAgB,CAAE,GAAA,CAAKD,EAAQ,OAAQ,CAAC,CAClE,CAAA,CAAA,CAGME,EAAgBL,CACbA,EAAAA,CAAAA,CAAM,eAGTM,CAAAA,CAAAA,CAAgBN,GAA8C,CAClE,GAAIA,CAAM,CAAA,eAAA,CACR,OAAOO,OAAQ,CAAA,UAAA,CAAWP,EAAM,eAAgB,CAAA,UAAiB,EAAE,YAAa,EAGpF,CAEMQ,CAAAA,CAAAA,CAAcR,GACX,CAAC,CAACA,CAAM,CAAA,eAAA,CAGXS,EAAU,IAAmB,CACjC,IAAMC,CAAAA,CAAW,CACf,eAAiB,CAAA,EAAA,CACjB,gBAAiB,IACnB,CAAA,CACA,OAAAX,CAAUW,CAAAA,CAAQ,CACXA,CAAAA,CACT,EAEMC,CAAmB,CAAA,CACvBC,CACA,CAAA,CAAE,WAAAC,CAAY,CAAA,WAAA,CAAAC,CAAY,CAAA,GACiB,CAC3C,IAAMC,CAAAA,CAAa,IAAI,GAAI,CAAA,MAAA,CAAO,SAAS,IAAI,CAAA,CACzCC,CAAS,CAAA,IAAI,IAAI,CAAGJ,EAAAA,CAAAA,CAAO,SAAS,CAAA,OAAA,CAAS,EAEnDI,CAAO,CAAA,YAAA,CAAa,GAAI,CAAA,aAAA,CAAeD,EAAW,IAAI,CAAA,CACtDC,EAAO,YAAa,CAAA,GAAA,CAAI,cAAeD,CAAW,CAAA,IAAI,CAEtD,CAAA,IAAIE,EAAkB,IAEtB,CAAA,GAAIJ,CAAY,CAAA,CACdG,EAAO,YAAa,CAAA,GAAA,CAAI,aAAeH,CAAAA,CAAU,EAEjD,IAAMK,CAAAA,CAAYX,OAAQ,CAAA,UAAA,CAAW,SAAS,CAC9CS,CAAAA,CAAAA,CAAO,YAAa,CAAA,GAAA,CAClB,aACAE,CAAU,CAAA,YAAA,EAAe,CAAA,QAAA,EAC3B,CAEAD,CAAAA,CAAAA,CAAkB,CAChB,UAAA,CAAYC,EAAU,QAAS,EAAA,CAC/B,WAAAL,CACA,CAAA,OAAA,CAASC,GAAe,EAC1B,EACF,CAEIA,GACFA,CAAY,CAAA,OAAA,CAASK,CAAe,EAAA,CAClCH,EAAO,YAAa,CAAA,MAAA,CAAO,aAAeG,CAAAA,CAAU,EACtD,CAAC,CAAA,CAGH,IAAMT,CAAWZ,CAAAA,CAAAA,GACjB,OAAAY,CAAAA,CAAS,eAAkBO,CAAAA,CAAAA,CAC3BlB,EAAUW,CAAQ,CAAA,CAEX,CAAE,GAAA,CAAKM,EAAO,QAAS,EAAA,CAAG,QAAAN,CAAAA,CAAS,CAC5C,CAEMU,CAAAA,CAAAA,CAAgB,MACpBR,CACAZ,CAAAA,CAAAA,CACA,CAAE,UAAAa,CAAAA,CAAAA,CAAY,WAAAC,CAAAA,CAAY,IACmC,CAC7D,GAAM,CAAE,GAAA,CAAAO,EAAK,QAAAX,CAAAA,CAAS,CAAIC,CAAAA,CAAAA,CAAiBC,EAAQ,CAAE,UAAA,CAAAC,EAAY,WAAAC,CAAAA,CAAY,CAAC,CAE9E,CAAA,OAAOQ,CAAuBV,CAAAA,CAAAA,CAAQS,EAAK,MAAOE,CAAAA,EAAS,CACzD,IAAMC,EAAeD,CACf,CAAA,CAAE,UAAYE,CAAAA,CAAAA,CAAW,WAAYC,CAAU,CAAA,CAAIF,EAEzD,GAAIE,CAAAA,CAAW,CACb,IAAMC,CAAAA,CAAe,CAAE,GAAGjB,EAAU,eAAiBgB,CAAAA,CAAU,CAC/D,CAAA,OAAA3B,EAAU4B,CAAY,CAAA,CACf,CAAC,CAAE,UAAAD,CAAW,CAAA,SAAA,CAAWD,GAAa,EAAG,CAAC,CACnD,CACA,MAAM,IAAI,KAAA,CAAM,mCAAmC,CACrD,CAAC,CACH,CAAA,CAEMG,EAAc,MAClBhB,CAAAA,CACA,CAAE,OAAA,CAAAiB,EAAS,KAAAC,CAAAA,CAAAA,CAAO,UAAAC,CAAW,CAAA,WAAA,CAAAC,EAAa,KAAOC,CAAAA,CAAa,CAC3D,GAAA,CACH,IAAMZ,CAAMW,CAAAA,CAAAA,EAAe,MAAO,CAAA,QAAA,CAAS,KAE3C,GAAI,CAACX,CACH,CAAA,MAAM,IAAI,KAAM,CAAA,qCAAqC,CAGvD,CAAA,IAAMa,EAAO,IAAI,GAAA,CAAItB,CAAO,CAAA,SAAS,EACrC,OAAAsB,CAAAA,CAAK,QAAW,CAAA,cAAA,CAChBA,EAAK,YAAa,CAAA,MAAA,CAAO,SAAWL,CAAAA,CAAO,EAC3CK,CAAK,CAAA,YAAA,CAAa,OAAO,OAASJ,CAAAA,CAAAA,CAAM,SAAS,QAAQ,CAAC,CAC1DI,CAAAA,CAAAA,CAAK,aAAa,MAAO,CAAA,WAAA,CAAaH,CAAS,CAAA,CAC/CG,EAAK,YAAa,CAAA,MAAA,CAAO,aAAeb,CAAAA,CAAG,EAEvCY,CACFC,EAAAA,CAAAA,CAAK,aAAa,MAAO,CAAA,OAAA,CAASD,CAAY,CAGzCX,CAAAA,CAAAA,CAAuBV,CAAQsB,CAAAA,CAAAA,CAAK,UAAaC,CAAAA,CAAAA,GAC/C,CACL,SAAA,CAAWA,GAAO,aAAe,EAAA,SAAA,EAAa,EAC9C,CAAA,SAAA,CAAWA,GAAO,aAAe,EAAA,SAAA,EAAa,GAC9C,SAAWA,CAAAA,CAAAA,EAAO,eAAe,SAAa,EAAA,EAChD,CACD,CAAA,CACH,EAEMC,CAAmB,CAAA,CACvBpC,CACAqC,CAAAA,CAAAA,CACAC,IAGEtC,CAAM,CAAA,eAAA,EACNA,CAAM,CAAA,eAAA,CAAgB,aAAeqC,CAGnCC,CAAAA,CAAAA,CAAQ,CAAC,CAAE,CAAA,IAAA,GAAS,gBACpBA,CAAQ,CAAA,CAAC,CAAE,CAAA,MAAA,CAAO,UAAY,GAC7BtC,GAAAA,CAAAA,CAAM,eAAgB,CAAA,OAAA,CAAQ,SAAW,CACxCA,EAAAA,CAAAA,CAAM,eAAgB,CAAA,OAAA,CAAQ,SAASsC,CAAQ,CAAA,CAAC,EAAE,MAAO,CAAA,UAAU,GAGlE,KAGHC,CAAAA,CAAAA,CAAmB,MACvB3B,CAAAA,CACAZ,EACA,CAAE,UAAA,CAAAqC,CAAY,CAAA,OAAA,CAAAC,CAAQ,CACa,GAAA,CAEnC,IAAME,CAAAA,CAAa,IAAIC,SAAU,CAAA,gBAAA,CAC3BC,EAAUnC,OAAQ,CAAA,UAAA,CAAWP,EAAM,eAAiB,CAAA,UAAiB,CAE3E,CAAA,OAAA,MAAMwC,EAAW,MACf5B,CAAAA,CAAAA,CAAO,OAAQ,CAAA,SAAA,CACfZ,EAAM,eACN0C,CAAAA,CACF,CAGgB,CAAA,CAAA,KAAA,CADH,MAAMC,OAAQ,CAAA,CAAE,GAAG/B,CAAO,CAAA,OAAA,CAAS,SAAU4B,CAAW,CAAC,CAC3C,EAAA,OAAA,CAAQxC,EAAM,eAAe,CAAA,EAEzC,sBAAuB,CAAA,CACpC,WAAAqC,CACA,CAAA,OAAA,CAASC,CAAQ,CAAA,GAAA,CAAKM,GAAMC,YAAaD,CAAAA,CAAC,CAAC,CAC7C,CAAC,CACH,CAAA,CAEME,CAA6B,CAAA,CACjClC,EACAmC,CACW,GAAA,CACX,IAAM/B,CAAAA,CAAS,IAAI,GAAI,CAAA,CAAA,EAAGJ,CAAO,CAAA,SAAS,mBAAmB,CACvDoC,CAAAA,CAAAA,CAAmB,KAAK,SAAUD,CAAAA,CAAAA,CAAK,CAACE,CAAGC,CAAAA,CAAAA,GAAM,OAAOA,CAAAA,EAAM,SAAWA,CAAE,CAAA,QAAA,EAAaA,CAAAA,CAAC,EACzFC,CAAW,CAAA,kBAAA,CAAmBH,CAAgB,CAAA,CAEpD,OAAAhC,CAAO,CAAA,YAAA,CAAa,IAAI,mBAAqBmC,CAAAA,CAAQ,EACrDnC,CAAO,CAAA,YAAA,CAAa,GAAI,CAAA,cAAA,CAAgB,OAAO,QAAS,CAAA,MAAM,CAEvDA,CAAAA,CAAAA,CAAO,UAChB,CAAA,CAEMoC,CAA+B,CAAA,MACnCxC,EACAmC,CAC0C,GAAA,CAC1C,IAAM1B,CAAMyB,CAAAA,CAAAA,CAA2BlC,EAAQmC,CAAG,CAAA,CAC5CM,CACJ,CAAA,CAAA,MAAM/B,EAAuBV,CAAQS,CAAAA,CAAAA,CAAME,CAASA,EAAAA,CAAAA,CAAK,iBAAiB,CACzE,GAAA,KAAA,CAAM,GAAG,CAAA,CAEZ,GAAI,CAAC8B,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,gCAAgC,CAElD,CAAA,OAAO,OAAQ,CAAA,GAAA,CACbA,EAAU,GAAKC,CAAAA,CAAAA,EAAS1C,CAAO,CAAA,QAAA,CAAS,SAAS0C,CAAM,CAAA,QAAQ,CAAC,CAClE,CACF,CAIMC,CAAAA,CAAAA,CAAyB,MAC7B3C,CACAZ,CAAAA,CAAAA,CACA,CAAE,UAAAqC,CAAAA,CAAAA,CAAY,OAAAC,CAAAA,CAAQ,IACa,CACnC,GAAIA,CAAQ,CAAA,MAAA,GAAW,GAAKF,CAAiBpC,CAAAA,CAAAA,CAAOqC,CAAYC,CAAAA,CAAO,EACrE,GAAI,CACF,OAAO,MAAMC,CAAAA,CAAiB3B,EAAQZ,CAAO,CAAA,CAAE,UAAAqC,CAAAA,CAAAA,CAAY,QAAAC,CAAQ,CAAC,CACtE,CAAA,MAASkB,EAAO,CAEd,OAAA,CAAQ,IACN,CAAA,uDAAA,CACAA,CACF,EACF,CAIF,QADgB,MAAMJ,CAAAA,CAA6BxC,EAAQ,CAAC,CAAE,QAAUZ,CAAAA,CAAAA,CAAM,gBAAiB,UAAAqC,CAAAA,CAAAA,CAAY,OAAAC,CAAAA,CAAQ,CAAC,CAAC,CAAA,EACtG,CAAC,CAClB,EAEMmB,CAA0B,CAAA,MAC9B7C,CACAZ,CAAAA,CAAAA,CACA0D,IAGON,CAA6BxC,CAAAA,CAAAA,CAAQ8C,CAAc,CAAA,CAItDC,EAAsB,CAC1B/C,CAAAA,CACAgD,CACAC,CAAAA,CAAAA,CACAC,EACAC,CAEgB,GAAA,MAAOC,CAAwB,EAAA,CAC7C,IAAMnC,CAAUmC,CAAAA,CAAAA,CAAM,KAGhBC,CAAS,CAAA,IAAI,IAAID,CAAM,CAAA,MAAM,CAC7BE,CAAAA,CAAAA,CAAgB,IAAI,GAAItD,CAAAA,CAAAA,CAAO,SAAS,CAAA,CAE9C,GAAIqD,CAAO,CAAA,MAAA,GAAWC,CAAc,CAAA,MAAA,CAAQ,CAE1C,OAAQ,CAAA,IAAA,CAAK,yCAA0CD,CAAO,CAAA,MAAM,EACpE,MACF,CAEA,OAAQpC,CAAAA,CAAQ,QACd,KAAK,SACHiC,CAAAA,CAAAA,EAAa,OACbF,CAAAA,CAAAA,CAAQG,CAASlC,CAAAA,CAAO,CAAC,CACzB,CAAA,MACF,KAAK,SACHiC,CAAAA,CAAAA,EAAa,OACbD,CAAAA,CAAAA,CAAO,IAAI,KAAA,CAAMhC,EAAQ,YAAgB,EAAA,oBAAoB,CAAC,CAAA,CAC9D,MACF,QAEE,OAAA,CAAQ,IAAK,CAAA,2BAAA,CAA6BA,EAAQ,MAAM,EAC5D,CACF,CAKIP,CAAAA,CAAAA,CAAyB,CAC7BV,CACAS,CAAAA,CAAAA,CACA0C,CACe,GAAA,CACf,IAAMI,CAAc,CAAA,MAAA,CAAO,UAAc,EAAA,MAAA,CAAO,MAC1CC,CAAe,CAAA,MAAA,CAAO,WAAe,EAAA,MAAA,CAAO,OAC5CC,CAAQF,CAAAA,CAAAA,CAAAA,CAAcxE,GAAuB,CAC7C2E,CAAAA,CAAAA,CAAAA,CAAOF,EAAexE,CAAwB,EAAA,CAAA,CAE9CkE,CAAc,CAAA,MAAA,CAAO,KACzBzC,CACA,CAAA,aAAA,CACA,CAAS1B,MAAAA,EAAAA,CAAmB,WAAWC,CAAoB,CAAA,KAAA,EAAQ0E,CAAG,CAAA,MAAA,EAASD,CAAI,CACrF,CAAA,CAAA,CAEA,GAAI,CAACP,CAAAA,CACH,MAAM,IAAI,KAAA,CACR,0DACF,CAAA,CAGF,OAAO,IAAI,OAAA,CAAW,CAACF,CAAAA,CAASC,IAAW,CACzC,IAAMU,CAAiBZ,CAAAA,CAAAA,CACrB/C,EACAgD,CACAC,CAAAA,CAAAA,CACAC,EACAC,CACF,CAAA,CAEA,OAAO,gBAAiB,CAAA,SAAA,CAAWQ,CAAc,CAAA,CAEjD,IAAMC,CAAa,CAAA,WAAA,CAAY,IAAM,CAC/BV,EAAY,MACd,GAAA,MAAA,CAAO,mBAAoB,CAAA,SAAA,CAAWS,CAAc,CACpD,CAAA,aAAA,CAAcC,CAAU,CAAA,CACxBX,EAAO,IAAI,KAAA,CAAM,wBAAwB,CAAC,GAE9C,CAAGhE,CAAAA,CAAa,EAClB,CAAC,CACH,CAGa4E,CAAAA,CAAAA,CAA6B,CAACvE,CAAAA,CAAmBC,IAAqB,CACjF,IAAMS,EAASX,CAAmBC,CAAAA,CAAAA,CAAWC,CAAO,CAChDH,CAAAA,CAAAA,CAAQF,CAAgB,EAAA,CAE5B,OAAO,CACL,YAAA,CAAc,IAAMO,CAAAA,CAAaL,CAAK,CACtC,CAAA,YAAA,CAAc,IAAMM,CAAAA,CAAaN,CAAK,CACtC,CAAA,UAAA,CAAY,IAAMQ,CAAWR,CAAAA,CAAK,EAClC,OAAS,CAAA,KACPA,CAAQS,CAAAA,CAAAA,GACD,IAET,CAAA,CAAA,aAAA,CAAe,MAAOiE,CAAAA,EAAgE,CACpF,IAAMC,CAAAA,CAAS,MAAMvD,CAAAA,CAAcR,EAAQZ,CAAO0E,CAAAA,CAAM,EAExD,OAAA1E,CAAAA,CAAQF,GACD6E,CAAAA,CACT,CACA,CAAA,gBAAA,CAAmBD,GAAgE,CACjF,GAAM,CAAE,GAAA,CAAArD,EAAK,QAAAX,CAAAA,CAAS,CAAIC,CAAAA,CAAAA,CAAiBC,EAAQ8D,CAAM,CAAA,CACzD,OAAA1E,CAAQU,CAAAA,CAAAA,CACDW,CACT,CACA,CAAA,WAAA,CAAcqD,CAA8B9C,EAAAA,CAAAA,CAAYhB,EAAQ8D,CAAM,CAAA,CACtE,sBAAyBA,CAAAA,CAAAA,EACvBnB,EAAuB3C,CAAQZ,CAAAA,CAAAA,CAAO0E,CAAM,CAAA,CAC9C,wBAA0BE,CACxBnB,EAAAA,CAAAA,CAAwB7C,EAAQZ,CAAO4E,CAAAA,CAAY,CACvD,CACF,CAAA,CCxWA,IAAMC,CAAAA,CAAmB,CAAC1E,CAAmBD,CAAAA,CAAAA,GAAuB,CAClE,GAAIA,EACF,OAAOA,CAAAA,CAGT,GAAG,CAACC,EACF,OAAO,yBAAA,CAGT,OAAQA,CAAQ,CAAA,SAAA,EACd,KAAK,SAAA,CACH,OAAO,yBAAA,CACT,KAAK,SACH,CAAA,OAAO,iCACT,CAAA,QACE,OAAO,yBACX,CACF,CAEM2E,CAAAA,CAAAA,CAAmB,MACvBJ,CACAvE,CAAAA,CAAAA,IAKO,CACL,MAHasE,CAAAA,CAAAA,CAA2BC,EAAO,SAAWvE,CAAAA,CAAO,CAInE,CAAA,CAAA,CAGI4E,EAGF,MAAO,CAAE,QAAAC,CAAAA,CAAAA,CAAU,QAAAC,CAAS,CAAA,KAAA,CAAAC,CAAO,CAAA,MAAA,CAAAR,EAAQ,MAAAS,CAAAA,CAAO,CAAM,GAAA,CAC1D,IAAMnF,CAAQ,CAAA,MAAM8E,CAAiBJ,CAAAA,CAAAA,CAAQO,EAAQ,OAAO,CAAA,CAEtDG,CAAc,CAAA,SAAqC,CACvD,IAAM1D,CAAAA,CAAY1B,CAAM,CAAA,MAAA,CAAO,cACzByB,CAAAA,CAAAA,CAAYzB,EAAM,MAAO,CAAA,YAAA,GAE/B,OAAO,CACL,CACE,SAAA,CAAA0B,EACA,SAAWD,CAAAA,CAAAA,CAAYA,CAAU,CAAA,QAAA,GAAa,EAChD,CACF,CACF,CAAA,CAEA,OAAO,CACL,MAAM,OAAO,CAAE,UAAA,CAAAZ,EAAY,WAAAC,CAAAA,CAAY,CAAG,CAAA,CACxC,OAAKd,CAAM,CAAA,MAAA,CAAO,UAAW,EAAA,EAC3B,MAAMA,CAAM,CAAA,MAAA,CAAO,aAAc,CAAA,CAC/B,WAAAa,CACA,CAAA,WAAA,CAAAC,CACF,CAAC,CAAA,CAGIsE,GACT,CAAA,CAEA,MAAM,OAAA,EAAU,CACdpF,CAAM,CAAA,MAAA,CAAO,OAAQ,GACvB,EAEA,MAAM,WAAA,EAAc,CAClB,OAAOoF,GACT,CAAA,CAEA,MAAM,WAAc,EAAA,CAClB,MAAM,IAAI,KAAA,CAAM,CAA2BJ,wBAAAA,EAAAA,CAAAA,CAAS,IAAI,CAAE,CAAA,CAC5D,CAEA,CAAA,MAAM,YAAY,CAChB,OAAA,CAAAnD,CACA,CAAA,KAAA,CAAAC,EACA,SAAAC,CAAAA,CAAAA,CACA,YAAAC,CACA,CAAA,KAAA,CAAOqD,CACT,CAAG,CAAA,CACD,OAAAF,CAAAA,CAAO,IAAI,cAAgB,CAAA,CAAE,OAAAtD,CAAAA,CAAQ,CAAC,CAE/B,CAAA,MAAM7B,CAAM,CAAA,MAAA,CAAO,YAAY,CACpC,OAAA,CAAA6B,EACA,KAAAC,CAAAA,CAAAA,CACA,UAAAC,CACA,CAAA,WAAA,CAAAC,CACA,CAAA,KAAA,CAAOqD,CACT,CAAC,CACH,CAEA,CAAA,MAAM,uBAAuB,CAAE,QAAA,CAAAC,CAAU,CAAA,UAAA,CAAAjD,EAAY,OAAAC,CAAAA,CAAQ,EAAG,CAC9D6C,CAAAA,CAAO,IAAI,wBAA0B,CAAA,CACnC,QAAAG,CAAAA,CAAAA,CACA,WAAAjD,CACA,CAAA,OAAA,CAAAC,CACF,CAAC,EAED,GAAM,CAAE,QAAAiD,CAAAA,CAAS,EAAIL,CAAM,CAAA,QAAA,GAE3B,GAAI,CAAClF,EAAM,MAAO,CAAA,UAAA,EAAgB,EAAA,CAACuF,EACjC,MAAM,IAAI,KAAM,CAAA,sBAAsB,EAGxC,IAAMC,CAAAA,CAAkBxF,CAAM,CAAA,MAAA,CAAO,cAErC,CAAA,GAAIsF,GAAYE,CAAoBF,GAAAA,CAAAA,CAClC,MAAM,IAAI,KAAA,CACR,CAAgBE,aAAAA,EAAAA,CAAe,qBAAqBF,CAAQ,CAAA,CAC9D,CAGF,CAAA,OAAOtF,EAAM,MAAO,CAAA,sBAAA,CAAuB,CACzC,UAAA,CAAYqC,GAAckD,CAAS,CAAA,UAAA,CACnC,QAAAjD,CACF,CAAC,CACH,CAEA,CAAA,MAAM,uBAAwB,CAAA,CAAE,aAAAsC,CAAa,CAAA,CAAG,CAG9C,GAFAO,EAAO,GAAI,CAAA,yBAAA,CAA2B,CAAE,YAAA,CAAAP,CAAa,CAAC,CAAA,CAElD,CAAC5E,CAAM,CAAA,MAAA,CAAO,YAChB,CAAA,MAAM,IAAI,KAAA,CAAM,sBAAsB,CAGxC,CAAA,OAAOA,CAAM,CAAA,MAAA,CAAO,wBAClB4E,CACF,CACF,CAEA,CAAA,sBAAA,EAAyB,CACvB,OAAO,CAAA,EAAGF,EAAO,SAAS,CAAA,aAAA,CAC5B,CACF,CACF,CAAA,CAEO,SAASe,CAAAA,CAAiB,CAC/B,SAAAvF,CAAAA,CAAAA,CACA,OAAAwF,CAAAA,CAAAA,CAAUhG,EACV,UAAAiG,CAAAA,CAAAA,CAAa,KACf,CAAA,CAAuB,EAAyC,CAAA,CAC9D,OAAcC,MAAAA,CAAAA,GACL,CACL,EAAI,CAAA,cAAA,CACJ,IAAM,CAAA,UAAA,CACN,SAAU,CACR,IAAA,CAAM,cACN,CAAA,WAAA,CACE,6DACF,OAAAF,CAAAA,CAAAA,CACA,UAAAC,CAAAA,CAAAA,CACA,UAAW,IACX,CAAA,WAAA,CAAad,EAAiBe,CAAc,CAAA,OAAA,CAAQ,QAAS1F,CAAS,CACxE,CACA,CAAA,IAAA,CAAO+E,GACEF,CAAY,CAAA,CACjB,GAAGE,CAAAA,CACH,OAAQ,CACN,SAAA,CAAWJ,CAAiBe,CAAAA,CAAAA,CAAc,QAAQ,OAAS1F,CAAAA,CAAS,CACtE,CACF,CAAC,CAEL,CAEJ,CAAA","file":"index.mjs","sourcesContent":["export const icon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iOTUiIGhlaWdodD0iOTUiIHZpZXdCb3g9IjAgMCA5NSA5NSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xLjc3NjE3IDU5LjE4MjZMNjIuNzIyNyA2My4zMTNDNjMuMTE4NSA2My40MzA5IDYzLjQ3ODggNjMuNjQ1NiA2My43NzA4IDYzLjkzNzdDNjQuMDYyOSA2NC4yMjk3IDY0LjI3NzUgNjQuNTg5OSA2NC4zOTU0IDY0Ljk4NThMNjguNTI1OSA3OC44NTU1QzY4LjY3ODcgNzkuMzY4NiA2OC45OTMyIDc5LjgxODYgNjkuNDIyNCA4MC4xMzg3QzY5Ljg1MTYgODAuNDU4NyA3MC4zNzI3IDgwLjYzMTYgNzAuOTA4MiA4MC42MzE2QzcxLjQ0MzYgODAuNjMxNiA3MS45NjQ3IDgwLjQ1ODcgNzIuMzkzOSA4MC4xMzg3QzcyLjgyMzEgNzkuODE4NiA3My4xMzc2IDc5LjM2ODYgNzMuMjkwNCA3OC44NTU1TDc3LjQyMDkgNjQuOTg1OEM3Ny41Mzg4IDY0LjU4OTkgNzcuNzUzNCA2NC4yMjk3IDc4LjA0NTUgNjMuOTM3N0M3OC4zMzc2IDYzLjY0NTYgNzguNjk3OCA2My40MzA5IDc5LjA5MzYgNjMuMzEzTDkyLjk2MzMgNTkuMTgyNkM5My40NzY0IDU5LjAyOTcgOTMuOTI2NSA1OC43MTUzIDk0LjI0NjYgNTguMjg2MUM5NC41NjY2IDU3Ljg1NjggOTQuNzM5NSA1Ny4zMzU3IDk0LjczOTUgNTYuODAwM0M5NC43Mzk1IDU2LjI2NDkgOTQuNTY2NiA1NS43NDM4IDk0LjI0NjYgNTUuMzE0NkM5My45MjY1IDU0Ljg4NTMgOTMuNDc2NCA1NC41NzA5IDkyLjk2MzMgNTQuNDE4MUw3OS4wOTM3IDUwLjI4NzZDNzguNjk3OCA1MC4xNjk3IDc4LjMzNzYgNDkuOTU1IDc4LjA0NTUgNDkuNjYzQzc3Ljc1MzUgNDkuMzcwOSA3Ny41Mzg4IDQ5LjAxMDcgNzcuNDIwOSA0OC42MTQ4TDczLjI5MDQgMzQuNzQ1MkM3My4xMzc2IDM0LjIzMiA3Mi44MjMyIDMzLjc4MTkgNzIuMzkzOSAzMy40NjE5QzcxLjk2NDcgMzMuMTQxOSA3MS40NDM2IDMyLjk2OSA3MC45MDgyIDMyLjk2OUM3MC4zNzI4IDMyLjk2OSA2OS44NTE3IDMzLjE0MTkgNjkuNDIyNCAzMy40NjE5QzY4Ljk5MzIgMzMuNzgxOSA2OC42Nzg4IDM0LjIzMiA2OC41MjYgMzQuNzQ1Mkw2NC4zOTU0IDQ4LjYxNDhDNjQuMjc3NiA0OS4wMTA3IDY0LjA2MjkgNDkuMzcwOSA2My43NzA4IDQ5LjY2M0M2My40Nzg4IDQ5Ljk1NSA2My4xMTg1IDUwLjE2OTcgNjIuNzIyNyA1MC4yODc2TDEuNzc2MTggNTQuNDE4MUMxLjI2MzA1IDU0LjU3MDkgMC44MTI5NTYgNTQuODg1MyAwLjQ5MjkyIDU1LjMxNDZDMC4xNzI4ODQgNTUuNzQzOCAyLjI0NzU1ZS0wNiA1Ni4yNjQ5IDAgNTYuODAwM0MtMi4yNDc1MWUtMDYgNTcuMzM1NyAwLjE3Mjg4NyA1Ny44NTY4IDAuNDkyOTIgNTguMjg2MUMwLjgxMjk1MyA1OC43MTUzIDEuMjYzMDMgNTkuMDI5NyAxLjc3NjE3IDU5LjE4MjZaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTMyLjE2MzcgMjkuNDg2OEw0MC4zNTc4IDMxLjkyNzFDNDAuNTkxNyAzMS45OTY3IDQwLjgwNDUgMzIuMTIzNiA0MC45NzcgMzIuMjk2MUM0MS4xNDk2IDMyLjQ2ODcgNDEuMjc2NCAzMi42ODE1IDQxLjM0NjEgMzIuOTE1NEw0My43ODYzIDQxLjEwOTVDNDMuODc2NiA0MS40MTI2IDQ0LjA2MjQgNDEuNjc4NSA0NC4zMTYgNDEuODY3NkM0NC41Njk2IDQyLjA1NjcgNDQuODc3NCA0Mi4xNTg4IDQ1LjE5MzcgNDIuMTU4OEM0NS41MTAxIDQyLjE1ODggNDUuODE3OSA0Mi4wNTY3IDQ2LjA3MTUgNDEuODY3NkM0Ni4zMjUxIDQxLjY3ODUgNDYuNTEwOSA0MS40MTI2IDQ2LjYwMTEgNDEuMTA5NUw0OS4wNDE0IDMyLjkxNTRDNDkuMTExMSAzMi42ODE1IDQ5LjIzNzkgMzIuNDY4NyA0OS40MTA0IDMyLjI5NjFDNDkuNTgzIDMyLjEyMzYgNDkuNzk1OCAzMS45OTY3IDUwLjAyOTcgMzEuOTI3MUw1OC4yMjM4IDI5LjQ4NjhDNTguNTI2OSAyOS4zOTY2IDU4Ljc5MjggMjkuMjEwOCA1OC45ODE5IDI4Ljk1NzJDNTkuMTcxIDI4LjcwMzYgNTkuMjczMSAyOC4zOTU4IDU5LjI3MzEgMjguMDc5NEM1OS4yNzMxIDI3Ljc2MzEgNTkuMTcxIDI3LjQ1NTMgNTguOTgxOSAyNy4yMDE3QzU4Ljc5MjggMjYuOTQ4MSA1OC41MjY5IDI2Ljc2MjMgNTguMjIzOCAyNi42NzJMNTAuMDI5NiAyNC4yMzE3QzQ5Ljc5NTggMjQuMTYyMSA0OS41ODI5IDI0LjAzNTIgNDkuNDEwNCAyMy44NjI3QzQ5LjIzNzkgMjMuNjkwMiA0OS4xMTEgMjMuNDc3MyA0OS4wNDE0IDIzLjI0MzRMNDYuNjAxMSAxNS4wNDkzQzQ2LjUxMDggMTQuNzQ2MiA0Ni4zMjUgMTQuNDgwMyA0Ni4wNzE1IDE0LjI5MTJDNDUuODE3OSAxNC4xMDIxIDQ1LjUxIDE0IDQ1LjE5MzcgMTRDNDQuODc3NCAxNCA0NC41Njk1IDE0LjEwMjEgNDQuMzE1OSAxNC4yOTEyQzQ0LjA2MjMgMTQuNDgwMyA0My44NzY2IDE0Ljc0NjIgNDMuNzg2MyAxNS4wNDkzTDQxLjM0NiAyMy4yNDM0QzQxLjI3NjQgMjMuNDc3MyA0MS4xNDk1IDIzLjY5MDIgNDAuOTc3IDIzLjg2MjdDNDAuODA0NCAyNC4wMzUyIDQwLjU5MTYgMjQuMTYyMSA0MC4zNTc4IDI0LjIzMTdMMzIuMTYzNyAyNi42NzJDMzEuODYwNSAyNi43NjIyIDMxLjU5NDYgMjYuOTQ4IDMxLjQwNTUgMjcuMjAxNkMzMS4yMTY0IDI3LjQ1NTIgMzEuMTE0MyAyNy43NjMxIDMxLjExNDMgMjguMDc5NEMzMS4xMTQzIDI4LjM5NTggMzEuMjE2NCAyOC43MDM3IDMxLjQwNTUgMjguOTU3MkMzMS41OTQ2IDI5LjIxMDggMzEuODYwNSAyOS4zOTY2IDMyLjE2MzcgMjkuNDg2OFoiIGZpbGw9ImJsYWNrIi8+Cjwvc3ZnPgo=';\n","import type {\n Action,\n FinalExecutionOutcome,\n Network,\n SignMessageParams,\n Transaction,\n} from \"@near-wallet-selector/core\";\nimport { createAction } from \"@near-wallet-selector/wallet-utils\";\nimport { connect, keyStores, providers } from \"near-api-js\";\nimport type { PublicKey } from \"near-api-js/lib/utils/index.js\";\nimport { KeyPair } from \"near-api-js/lib/utils/index.js\";\nimport { WalletConfig, WalletMessage, WalletResponseData, WalletState } from \"./types\";\n\n\n// Constants\nconst DEFAULT_POPUP_WIDTH = 480;\nconst DEFAULT_POPUP_HEIGHT = 640;\nconst POLL_INTERVAL = 300;\n\n\n// State management\nconst getInitialState = (): WalletState => ({\n signedAccountId: localStorage.getItem(\"bitte:signedAccountId\") || \"\",\n functionCallKey: JSON.parse(localStorage.getItem(\"bitte:functionCallKey\") || \"null\"),\n});\n\nconst saveState = (state: WalletState): void => {\n localStorage.setItem(\"bitte:signedAccountId\", state.signedAccountId);\n localStorage.setItem(\"bitte:functionCallKey\", JSON.stringify(state.functionCallKey));\n};\n\n// Create wallet configuration\nconst createWalletConfig = (walletUrl: string, network: Network): WalletConfig => ({\n walletUrl,\n network,\n provider: new providers.JsonRpcProvider({ url: network.nodeUrl }),\n});\n\n// Core functions\nconst getAccountId = (state: WalletState): string => {\n return state.signedAccountId;\n};\n\nconst getPublicKey = (state: WalletState): PublicKey | undefined => {\n if (state.functionCallKey) {\n return KeyPair.fromString(state.functionCallKey.privateKey as any).getPublicKey();\n }\n return undefined;\n};\n\nconst isSignedIn = (state: WalletState): boolean => {\n return !!state.signedAccountId;\n};\n\nconst signOut = (): WalletState => {\n const newState = {\n signedAccountId: \"\",\n functionCallKey: null,\n };\n saveState(newState);\n return newState;\n};\n\nconst requestSignInUrl = (\n config: WalletConfig,\n { contractId, methodNames }: { contractId: string; methodNames?: Array }\n): { url: string; newState: WalletState } => {\n const currentUrl = new URL(window.location.href);\n const newUrl = new URL(`${config.walletUrl}/login/`);\n\n newUrl.searchParams.set(\"success_url\", currentUrl.href);\n newUrl.searchParams.set(\"failure_url\", currentUrl.href);\n\n let functionCallKey = null;\n\n if (contractId) {\n newUrl.searchParams.set(\"contract_id\", contractId);\n\n const accessKey = KeyPair.fromRandom(\"ed25519\");\n newUrl.searchParams.set(\n \"public_key\",\n accessKey.getPublicKey().toString()\n );\n\n functionCallKey = {\n privateKey: accessKey.toString(),\n contractId,\n methods: methodNames || [],\n };\n }\n\n if (methodNames) {\n methodNames.forEach((methodName) => {\n newUrl.searchParams.append(\"methodNames\", methodName);\n });\n }\n\n const newState = getInitialState();\n newState.functionCallKey = functionCallKey;\n saveState(newState);\n\n return { url: newUrl.toString(), newState };\n};\n\nconst requestSignIn = async (\n config: WalletConfig,\n state: WalletState,\n { contractId, methodNames }: { contractId: string; methodNames?: Array }\n): Promise> => {\n const { url, newState } = requestSignInUrl(config, { contractId, methodNames });\n\n return handlePopupTransaction(config, url, async (data) => {\n const responseData = data as WalletResponseData;\n const { public_key: publicKey, account_id: accountId } = responseData;\n\n if (accountId) {\n const updatedState = { ...newState, signedAccountId: accountId };\n saveState(updatedState);\n return [{ accountId, publicKey: publicKey || \"\" }];\n }\n throw new Error(\"Invalid response data from wallet\");\n });\n};\n\nconst signMessage = async (\n config: WalletConfig,\n { message, nonce, recipient, callbackUrl, state: messageState }: SignMessageParams\n) => {\n const url = callbackUrl || window.location.href;\n\n if (!url) {\n throw new Error(`BitteWallet: CallbackUrl is missing`);\n }\n\n const href = new URL(config.walletUrl);\n href.pathname = \"sign-message\";\n href.searchParams.append(\"message\", message);\n href.searchParams.append(\"nonce\", nonce.toString(\"base64\"));\n href.searchParams.append(\"recipient\", recipient);\n href.searchParams.append(\"callbackUrl\", url);\n\n if (messageState) {\n href.searchParams.append(\"state\", messageState);\n }\n\n return handlePopupTransaction(config, href.toString(), (value) => {\n return {\n accountId: value?.signedRequest?.accountId || \"\",\n publicKey: value?.signedRequest?.publicKey || \"\",\n signature: value?.signedRequest?.signature || \"\",\n };\n });\n};\n\nconst storedKeyCanSign = (\n state: WalletState,\n receiverId: string,\n actions: Array\n): boolean => {\n if (\n state.functionCallKey &&\n state.functionCallKey.contractId === receiverId\n ) {\n return (\n actions[0].type === \"FunctionCall\" &&\n actions[0].params.deposit === \"0\" &&\n (state.functionCallKey.methods.length === 0 ||\n state.functionCallKey.methods.includes(actions[0].params.methodName))\n );\n }\n return false;\n};\n\nconst signUsingKeyPair = async (\n config: WalletConfig,\n state: WalletState,\n { receiverId, actions }: { receiverId: string; actions: Array }\n): Promise => {\n // instantiate an account (NEAR API is a nightmare)\n const myKeyStore = new keyStores.InMemoryKeyStore();\n const keyPair = KeyPair.fromString(state.functionCallKey!.privateKey as any);\n\n await myKeyStore.setKey(\n config.network.networkId,\n state.signedAccountId,\n keyPair\n );\n\n const near = await connect({ ...config.network, keyStore: myKeyStore });\n const account = await near.account(state.signedAccountId);\n\n return account.signAndSendTransaction({\n receiverId,\n actions: actions.map((a) => createAction(a)),\n });\n};\n\nconst requestSignTransactionsUrl = (\n config: WalletConfig,\n txs: Array\n): string => {\n const newUrl = new URL(`${config.walletUrl}/sign-transaction`);\n const stringifiedParam = JSON.stringify(txs, (_, v) => typeof v === 'bigint' ? v.toString() : v);\n const urlParam = encodeURIComponent(stringifiedParam);\n\n newUrl.searchParams.set('transactions_data', urlParam);\n newUrl.searchParams.set('callback_url', window.location.origin);\n\n return newUrl.toString();\n};\n\nconst signAndSendTransactionsPopUp = async (\n config: WalletConfig,\n txs: Array\n): Promise> => {\n const url = requestSignTransactionsUrl(config, txs);\n const txsHashes = (\n await handlePopupTransaction(config, url, (data) => data.transactionHashes)\n )?.split(\",\");\n\n if (!txsHashes) {\n throw new Error(\"No transaction hashes received\");\n }\n return Promise.all(\n txsHashes.map((hash) => config.provider.txStatus(hash, \"unused\"))\n );\n};\n\n\n\nconst signAndSendTransaction = async (\n config: WalletConfig,\n state: WalletState,\n { receiverId, actions }: { receiverId: string; actions: Array }\n): Promise => {\n if (actions.length === 1 && storedKeyCanSign(state, receiverId, actions)) {\n try {\n return await signUsingKeyPair(config, state, { receiverId, actions });\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\n \"Failed to sign using key pair, falling back to wallet\",\n error\n );\n }\n }\n\n const results = await signAndSendTransactionsPopUp(config, [{ signerId: state.signedAccountId, receiverId, actions }]);\n return results[0];\n};\n\nconst signAndSendTransactions = async (\n config: WalletConfig,\n state: WalletState,\n transactionsWS: Array\n): Promise> => {\n\n return signAndSendTransactionsPopUp(config, transactionsWS);\n};\n\n// Helper functions\nconst setupMessageHandler = (\n config: WalletConfig,\n resolve: (value: T) => void,\n reject: (reason?: unknown) => void,\n childWindow: Window | null,\n callback: (result: WalletMessage) => T\n): (event: MessageEvent) => Promise => {\n const handler = async (event: MessageEvent) => {\n const message = event.data as WalletMessage;\n\n // check if the URL are the same\n const origin = new URL(event.origin);\n const walletBaseUrl = new URL(config.walletUrl);\n\n if (origin.origin !== walletBaseUrl.origin) {\n // eslint-disable-next-line no-console\n console.warn(\"Ignoring message from different origin\", origin.origin);\n return;\n }\n\n switch (message.status) {\n case \"success\":\n childWindow?.close();\n resolve(callback(message));\n break;\n case \"failure\":\n childWindow?.close();\n reject(new Error(message.errorMessage || \"Transaction failed\"));\n break;\n default:\n // eslint-disable-next-line no-console\n console.warn(\"Unhandled message status:\", message.status);\n }\n };\n\n return handler;\n};\n\nconst handlePopupTransaction = (\n config: WalletConfig,\n url: string,\n callback: (result: WalletMessage) => T\n): Promise => {\n const screenWidth = window.innerWidth || screen.width;\n const screenHeight = window.innerHeight || screen.height;\n const left = (screenWidth - DEFAULT_POPUP_WIDTH) / 2;\n const top = (screenHeight - DEFAULT_POPUP_HEIGHT) / 2;\n\n const childWindow = window.open(\n url,\n \"BitteWallet\",\n `width=${DEFAULT_POPUP_WIDTH},height=${DEFAULT_POPUP_HEIGHT},top=${top},left=${left}`\n );\n\n if (!childWindow) {\n throw new Error(\n \"Popup window blocked. Please allow popups for this site.\"\n );\n }\n\n return new Promise((resolve, reject) => {\n const messageHandler = setupMessageHandler(\n config,\n resolve,\n reject,\n childWindow,\n callback\n );\n\n window.addEventListener(\"message\", messageHandler);\n\n const intervalId = setInterval(() => {\n if (childWindow.closed) {\n window.removeEventListener(\"message\", messageHandler);\n clearInterval(intervalId);\n reject(new Error(\"User closed the window\"));\n }\n }, POLL_INTERVAL);\n });\n};\n\n\nexport const createBitteWalletConnector = (walletUrl: string, network: Network) => {\n const config = createWalletConfig(walletUrl, network);\n let state = getInitialState();\n\n return {\n getAccountId: () => getAccountId(state),\n getPublicKey: () => getPublicKey(state),\n isSignedIn: () => isSignedIn(state),\n signOut: () => {\n state = signOut();\n return null;\n },\n requestSignIn: async (params: { contractId: string; methodNames?: Array }) => {\n const result = await requestSignIn(config, state, params);\n // Update state after sign-in\n state = getInitialState();\n return result;\n },\n requestSignInUrl: (params: { contractId: string; methodNames?: Array }) => {\n const { url, newState } = requestSignInUrl(config, params);\n state = newState;\n return url;\n },\n signMessage: (params: SignMessageParams) => signMessage(config, params),\n signAndSendTransaction: (params: { receiverId: string; actions: Array }) =>\n signAndSendTransaction(config, state, params),\n signAndSendTransactions: (transactions: Array) =>\n signAndSendTransactions(config, state, transactions),\n };\n};","import type {\n WalletModuleFactory,\n WalletBehaviourFactory,\n Transaction,\n Network,\n Account,\n InjectedWallet,\n} from \"@near-wallet-selector/core\";\nimport { icon } from \"./icon\";\nimport { createBitteWalletConnector } from \"./bitte-wallet\";\nimport { BitteWalletExtraOptions, BitteWalletParams, BitteWalletState } from \"./types\";\n\nconst resolveWalletUrl = (network?: Network, walletUrl?: string) => {\n if (walletUrl) {\n return walletUrl;\n }\n\n if(!network){\n return \"https://wallet.bitte.ai\";\n }\n\n switch (network.networkId) {\n case \"mainnet\":\n return \"https://wallet.bitte.ai\";\n case \"testnet\":\n return \"https://testnet.wallet.bitte.ai\";\n default:\n return \"https://wallet.bitte.ai\";\n }\n};\n\nconst setupWalletState = async (\n params: BitteWalletExtraOptions,\n network: Network\n): Promise => {\n // Use the factory function instead of the class constructor\n const wallet = createBitteWalletConnector(params.walletUrl, network);\n\n return {\n wallet,\n };\n};\n\nconst BitteWallet: WalletBehaviourFactory<\n InjectedWallet,\n { params: BitteWalletExtraOptions }\n> = async ({ metadata, options, store, params, logger }) => {\n const state = await setupWalletState(params, options.network);\n\n const getAccounts = async (): Promise> => {\n const accountId = state.wallet.getAccountId();\n const publicKey = state.wallet.getPublicKey();\n\n return [\n {\n accountId,\n publicKey: publicKey ? publicKey.toString() : \"\",\n },\n ];\n };\n\n return {\n async signIn({ contractId, methodNames }) {\n if (!state.wallet.isSignedIn()) {\n await state.wallet.requestSignIn({\n contractId,\n methodNames,\n });\n }\n\n return getAccounts();\n },\n\n async signOut() {\n state.wallet.signOut();\n },\n\n async getAccounts() {\n return getAccounts();\n },\n\n async verifyOwner() {\n throw new Error(`Method not supported by ${metadata.name}`);\n },\n\n async signMessage({\n message,\n nonce,\n recipient,\n callbackUrl,\n state: sgnState,\n }) {\n logger.log(\"sign message\", { message });\n\n return await state.wallet.signMessage({\n message,\n nonce,\n recipient,\n callbackUrl,\n state: sgnState,\n });\n },\n\n async signAndSendTransaction({ signerId, receiverId, actions }) {\n logger.log(\"signAndSendTransaction\", {\n signerId,\n receiverId,\n actions,\n });\n\n const { contract } = store.getState();\n\n if (!state.wallet.isSignedIn() || !contract) {\n throw new Error(\"Wallet not signed in\");\n }\n\n const signedAccountId = state.wallet.getAccountId();\n\n if (signerId && signedAccountId !== signerId) {\n throw new Error(\n `Signed in as ${signedAccountId}, cannot sign for ${signerId}`\n );\n }\n\n return state.wallet.signAndSendTransaction({\n receiverId: receiverId || contract.contractId,\n actions,\n });\n },\n\n async signAndSendTransactions({ transactions }) {\n logger.log(\"signAndSendTransactions\", { transactions });\n\n if (!state.wallet.isSignedIn()) {\n throw new Error(\"Wallet not signed in\");\n }\n\n return state.wallet.signAndSendTransactions(\n transactions as Array\n );\n },\n\n buildImportAccountsUrl() {\n return `${params.walletUrl}/batch-import`;\n },\n };\n};\n\nexport function setupBitteWallet({\n walletUrl,\n iconUrl = icon,\n deprecated = false,\n}: BitteWalletParams = {}): WalletModuleFactory {\n return async (moduleOptions) => {\n return {\n id: \"bitte-wallet\",\n type: \"injected\",\n metadata: {\n name: \"Bitte Wallet\",\n description:\n \"NEAR wallet to store, buy, send and stake assets for DeFi.\",\n iconUrl,\n deprecated,\n available: true,\n downloadUrl: resolveWalletUrl(moduleOptions.options.network, walletUrl),\n },\n init: (options) => {\n return BitteWallet({\n ...options,\n params: {\n walletUrl: resolveWalletUrl(moduleOptions.options.network, walletUrl),\n },\n });\n },\n };\n };\n}"]} \ No newline at end of file From 857f5f77613a0f4f43f51c571389b6c0d32dbae7 Mon Sep 17 00:00:00 2001 From: Ruben Marcus Date: Mon, 24 Mar 2025 16:25:03 +0000 Subject: [PATCH 3/4] add decoded --- src/bitte-wallet.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bitte-wallet.ts b/src/bitte-wallet.ts index 5427cd2..d2c0760 100644 --- a/src/bitte-wallet.ts +++ b/src/bitte-wallet.ts @@ -216,7 +216,7 @@ const signAndSendTransactionsPopUp = async ( const url = requestSignTransactionsUrl(config, txs); const txsHashes = ( await handlePopupTransaction(config, url, (data) => data.transactionHashes) - )?.split(","); + )?.split(",").map(decodeURIComponent); if (!txsHashes) { throw new Error("No transaction hashes received"); From 6f0464edd7ec3ef4bb26c907e67488aa31b4ec2f Mon Sep 17 00:00:00 2001 From: Ruben Marcus Date: Mon, 24 Mar 2025 16:41:08 +0000 Subject: [PATCH 4/4] res --- src/bitte-wallet.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/bitte-wallet.ts b/src/bitte-wallet.ts index d2c0760..bfd9211 100644 --- a/src/bitte-wallet.ts +++ b/src/bitte-wallet.ts @@ -218,12 +218,21 @@ const signAndSendTransactionsPopUp = async ( await handlePopupTransaction(config, url, (data) => data.transactionHashes) )?.split(",").map(decodeURIComponent); + + console.log(txsHashes, 'hashes') + + if (!txsHashes) { throw new Error("No transaction hashes received"); } - return Promise.all( + + const res = Promise.all( txsHashes.map((hash) => config.provider.txStatus(hash, "unused")) ); + + console.log(res, 'res') + + return res };