From 421c5f6e383100918ee8d195132c33c39000a94c Mon Sep 17 00:00:00 2001 From: Dan Wagner Date: Thu, 30 May 2024 18:53:00 -0700 Subject: [PATCH] Merge changes from the yours repo (#211) (#212) * Merge changes from the yours repo (#211) * position receive button within the tabpanel * renaming (#1) * renaming * update github funding * update PandaEmitEvent to YoursEmitEvent * update PandaRequest to YoursRequest * update HOSTED_PANDA_IMAGE to HOSTED_YOURS_IMAGE * update locked message * update createPandaMethod to createYoursMethod * update PANDA_DEV_WALLET to YOURS_DEV_WALLET * update PANDA_GITHUB_REPO to YOURS_GITHUB_REPO * update text * update InternalPandaTags to InternalYoursTags * seedlings * yours_wallet_keys.json * update github repo url * update PandaHeadProps to YoursHeadProps * update panda to yoursLogo * update PandaImg to YoursImg * use yours-logo.png instead (for now) * can be replaced with a colored .svg when available * update PandaHead to YoursHead * update text * cleanup * this image is not used * update createPandaEventEmitter to createYoursEventEmitter * update text * rename file * typo * bullets * minor copy update * YoursHead to YoursIcon * update logo --------- Co-authored-by: Dan Wagner --------- Co-authored-by: Ryan Wold * feat: expose indentity key and rename --------- Co-authored-by: Ryan Wold --- .github/FUNDING.yml | 2 +- CODE_OF_CONDUCT.md | 12 ++-- CONTRIBUTING.md | 8 +-- GOVERNANCE.md | 2 +- PRIVACY_POLICY.md | 22 +++---- README.md | 18 +++--- package-lock.json | 4 +- package.json | 2 +- public/background.js | 8 +-- public/content.js | 6 +- public/inject.js | 56 +++++++++--------- src/assets/panda-logo-wide.png | Bin 17678 -> 0 bytes .../{PandaHead.tsx => YoursIcon.tsx} | 14 ++--- src/hooks/useBsv.ts | 4 +- src/hooks/useContracts.ts | 5 +- src/hooks/useGorillaPool.ts | 6 +- src/hooks/useSocialProfile.ts | 4 +- src/pages/AppsAndTools.tsx | 18 +++--- src/pages/BsvWallet.tsx | 4 +- src/pages/OrdWallet.tsx | 2 +- src/pages/Settings.tsx | 4 +- src/pages/onboarding/ImportWallet.tsx | 6 +- src/pages/requests/OrdPurchaseRequest.tsx | 4 +- src/utils/constants.ts | 6 +- src/utils/keys.ts | 4 +- 25 files changed, 112 insertions(+), 109 deletions(-) delete mode 100644 src/assets/panda-logo-wide.png rename src/components/{PandaHead.tsx => YoursIcon.tsx} (87%) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 029825a4..7de45b4b 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,4 +1,4 @@ # These are supported funding model platforms open_collective: panda-wallet -github: panda-wallet +github: yours-wallet diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 39a20807..438b76ec 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,8 +1,8 @@ -## Panda Wallet Code of Conduct +## Yours Wallet Code of Conduct **Introduction:** -The Panda Wallet community is committed to providing a safe, respectful, and inclusive environment for all contributors and users. This code of conduct outlines our expectations for behavior and sets the standard for how we interact within our community. +The Yours Wallet community is committed to providing a safe, respectful, and inclusive environment for all contributors and users. This code of conduct outlines our expectations for behavior and sets the standard for how we interact within our community. **1. Purpose:** @@ -10,7 +10,7 @@ The purpose of this code of conduct is to ensure that all individuals, regardles **2. Expected Behavior:** -When interacting within the Panda Wallet community, we expect all community members, including contributors, maintainers, and users, to: +When interacting within the Yours Wallet community, we expect all community members, including contributors, maintainers, and users, to: - Be respectful and considerate of others. - Use welcoming and inclusive language. @@ -36,7 +36,7 @@ Consequences for violating this code of conduct may include warnings, temporary **5. Enforcement Responsibilities:** -The enforcement of this code of conduct is the responsibility of Panda Wallet's Maintainers and ultimately the Project Lead. They are responsible for reviewing reports, conducting investigations, and taking appropriate action to address violations. Their decisions will be guided by the principles of fairness and due process. +The enforcement of this code of conduct is the responsibility of Yours Wallet's Maintainers and ultimately the Project Lead. They are responsible for reviewing reports, conducting investigations, and taking appropriate action to address violations. Their decisions will be guided by the principles of fairness and due process. **6. Contact Information:** @@ -48,8 +48,8 @@ This code of conduct may be revised or improved over time to better serve the co **8. Acknowledgment:** -By participating in the Panda Wallet community, you acknowledge your commitment to abiding by this code of conduct and helping to create a positive and inclusive environment. +By participating in the Yours Wallet community, you acknowledge your commitment to abiding by this code of conduct and helping to create a positive and inclusive environment. **Conclusion:** -The Panda Wallet community thrives on collaboration, respect, and diverse perspectives. We appreciate your cooperation in making this a welcoming place for everyone, and we look forward to working together for the betterment of our project. +The Yours Wallet community thrives on collaboration, respect, and diverse perspectives. We appreciate your cooperation in making this a welcoming place for everyone, and we look forward to working together for the betterment of our project. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3ad7e71a..0e6ec083 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ -## Contributing to Panda Wallet +## Contributing to Yours Wallet -Thank you for your interest in contributing to Panda Wallet! Your contributions are what move the project forward. Please follow these steps to set up your development environment and ensure that your code adheres to our formatting standards. +Thank you for your interest in contributing to Yours Wallet! Your contributions are what move the project forward. Please follow these steps to set up your development environment and ensure that your code adheres to our formatting standards. ## Getting Started @@ -57,11 +57,11 @@ git commit -m "Your descriptive commit message" git push origin my-feature ``` -10. **Create a Pull Request:**: Navigate to your forked repository on GitHub, and you should see an option to create a pull request and merge into `Panda-Wallet:main`. Click it, fill out the pull request template, and submit your changes for review. +10. **Create a Pull Request:**: Navigate to your forked repository on GitHub, and you should see an option to create a pull request and merge into `Yours-Wallet:main`. Click it, fill out the pull request template, and submit your changes for review. 11. **Code Review:** Your changes will be reviewed, and you may be asked to make further adjustments. Once the changes are approved, they will be merged into the main project. -12. **Celebrate:** 🎉 Congratulations, you've contributed to Panda Wallet! +12. **Celebrate:** 🎉 Congratulations, you've contributed to Yours Wallet! **\*If you plan to contribute, please review the PR Guidelines** diff --git a/GOVERNANCE.md b/GOVERNANCE.md index 7a342849..2cfb53a3 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -24,7 +24,7 @@ #### Decision-Making Process: -**Issues and Features:** Contributors and the community can [Create an issue](https://github.com/Panda-Wallet/panda-wallet/issues) and track the [Kanban Board](https://github.com/orgs/Panda-Wallet/projects/1) to propose new features, discuss improvements, or report bugs. All PRs will require at least one approval from the Project Lead or a Maintainers. +**Issues and Features:** Contributors and the community can [Create an issue](https://github.com/yours-org/yours-wallet/issues) and track the [Kanban Board](https://github.com/orgs/Panda-Wallet/projects/1) to propose new features, discuss improvements, or report bugs. All PRs will require at least one approval from the Project Lead or a Maintainers. #### Pull Requests: diff --git a/PRIVACY_POLICY.md b/PRIVACY_POLICY.md index 9383ba9e..97a25f89 100644 --- a/PRIVACY_POLICY.md +++ b/PRIVACY_POLICY.md @@ -1,24 +1,24 @@ -# Privacy Policy for Panda Wallet +# Privacy Policy for Yours Wallet -Effective Date: October 25th, 2023 +Effective Date: March 7th, 2024 ### Introduction: -This Privacy Policy is intended to inform users of the Panda Wallet Browser Extension (referred to as "the Extension") about the collection, use, and disclosure of user data. Panda Wallet is a client-side, open-source application that does not have a backend and does not collect personal user data beyond the information automatically collected by Browser Extensions like Chrome, Firefox, etc regarding installation, usage, and performance. +This Privacy Policy is intended to inform users of the Yours Wallet Browser Extension (referred to as "the Extension") about the collection, use, and disclosure of user data. Yours Wallet is a client-side, open-source application that does not have a backend and does not collect personal user data beyond the information automatically collected by Browser Extensions like Chrome, Firefox, etc regarding installation, usage, and performance. ### Information Collection and Usage: -Extension Data: Panda Wallet does not collect, store, or transmit any personal user data. However, browser extensions may collect certain data, including but not limited to installation, usage, and performance statistics. These statistics are aggregated and anonymized and help us understand user engagement and improve the extension. +Extension Data: Yours Wallet does not collect, store, or transmit any personal user data. However, browser extensions may collect certain data, including but not limited to installation, usage, and performance statistics. These statistics are aggregated and anonymized and help us understand user engagement and improve the extension. -User Activity: Panda Wallet may collect and store data related to user interactions with the extension. This data is used solely for improving the functionality and user experience of the extension. It may include user settings, preferences, and interactions within the extension's user interface. +User Activity: Yours Wallet may collect and store data related to user interactions with the extension. This data is used solely for improving the functionality and user experience of the extension. It may include user settings, preferences, and interactions within the extension's user interface. ### Data Security: -Panda Wallet is committed to maintaining the security of user data. While the extension does not store personal information, we implement security measures to safeguard any data we may collect related to user activity within the extension. +Yours Wallet is committed to maintaining the security of user data. While the extension does not store personal information, we implement security measures to safeguard any data we may collect related to user activity within the extension. ### Data Sharing: -Panda Wallet does not share, sell, or trade user data with third parties. We do not have access to, or control over, data collected by browser extensions service providers, which is subject to separate privacy policies and practices. +Yours Wallet does not share, sell, or trade user data with third parties. We do not have access to, or control over, data collected by browser extensions service providers, which is subject to separate privacy policies and practices. ### Cookies: @@ -26,16 +26,16 @@ The extension does not use cookies or similar tracking technologies. No personal ### Contact Information: -For any questions or concerns regarding this Privacy Policy or the Panda Wallet extension, you may contact us on X @wallet_panda. +For any questions or concerns regarding this Privacy Policy or the Yours Wallet extension, you may contact us on X @[yoursxbt](https://x.com/yoursxbt). Changes to the Privacy Policy: -This Privacy Policy may be updated from time to time to reflect changes in our data practices or in response to user feedback. Any updates to this policy will be posted on the Panda Wallet extension page and in our GitHub repo. +This Privacy Policy may be updated from time to time to reflect changes in our data practices or in response to user feedback. Any updates to this policy will be posted on the Yours Wallet extension page and in our GitHub repo. Acceptance of Terms: -By using the Panda Wallet extension, you signify your acceptance of this Privacy Policy. If you do not agree with this policy, please do not use the extension. +By using the Yours Wallet extension, you signify your acceptance of this Privacy Policy. If you do not agree with this policy, please do not use the extension. Last Updated: October 25th, 2023 -Please review this Privacy Policy regularly to stay informed about how your data is managed within the Panda Wallet extension. +Please review this Privacy Policy regularly to stay informed about how your data is managed within the Yours Wallet extension. diff --git a/README.md b/README.md index af4c0e12..a85d0a03 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,13 @@ Version: v3.2.0 -🐼 Download Chrome Extension 🐼 +🌱 Download Chrome Extension 🌱 -# Panda Wallet | Non-Custodial Web3 Wallet For BSV +# Yours Wallet | Non-Custodial Web3 Wallet For BSV ## IMPORTANT NOTICE: Panda is in the process of rebranding to Yours Wallet. The wallet will automatically be updated but namespace changes to the repo will take some time! -Panda Wallet is an open-source and non-custodial web3 wallet for Bitcoin SV (BSV) and [1Sat Ordinals](https://docs.1satordinals.com/). This wallet allows users to have full control over their funds, providing security and independence in managing their assets. +Yours Wallet is an open-source and non-custodial web3 wallet for Bitcoin SV (BSV) and [1Sat Ordinals](https://docs.1satordinals.com/). This wallet allows users to have full control over their funds, providing security and independence in managing their assets. ## Features @@ -24,17 +24,17 @@ Panda Wallet is an open-source and non-custodial web3 wallet for Bitcoin SV (BSV #### Wallet Provider API 🚀 -Documentation on integrating Panda Wallet into your decentralized web3 application can be [found here](https://panda-wallet.gitbook.io/provider-api/). +Documentation on integrating Yours Wallet into your decentralized web3 application can be [found here](https://panda-wallet.gitbook.io/provider-api/). You can also check out the live sample app: https://panda-wallet-sample-app.vercel.app/ #### Contributing 🙌 -If you'd like to contribute to Panda Wallet's development check out [contributing](CONTRIBUTING.md). +If you'd like to contribute to the development of Yours Wallet, check out [contributing](CONTRIBUTING.md). ## Issues, Bugs, and Feature Requests -[Create an issue](https://github.com/Panda-Wallet/panda-wallet/issues) and track the [Kanban Board](https://github.com/orgs/Panda-Wallet/projects/1) +[Create an issue](https://github.com/yours-org/yours-wallet/issues) and track the [Kanban Board](https://github.com/orgs/Panda-Wallet/projects/1) ## Support The Project @@ -42,9 +42,9 @@ If you'd like to contribute to Panda Wallet's development check out [contributin ## Contact Us -[X](https://twitter.com/wallet_panda) - @wallet_panda -[Discord](https://discord.gg/qHs6hTkmsf) +- [@yoursxbt on X](https://twitter.com/yoursxbt) +- [Discord](https://discord.gg/qHs6hTkmsf) ## License -Panda Wallet is released under the [MIT License](https://opensource.org/licenses/MIT) +Yours Wallet is released under the [MIT License](https://opensource.org/licenses/MIT) diff --git a/package-lock.json b/package-lock.json index 39e79660..e603c308 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "panda-wallet", + "name": "yours-wallet", "version": "2.11.3", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "panda-wallet", + "name": "yours-wallet", "version": "2.11.3", "dependencies": { "@testing-library/jest-dom": "^5.17.0", diff --git a/package.json b/package.json index 3989e22c..0b6130ce 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "panda-wallet", + "name": "yours-wallet", "version": "3.2.0", "private": true, "dependencies": { diff --git a/public/background.js b/public/background.js index ab1a5ebb..fec0e420 100644 --- a/public/background.js +++ b/public/background.js @@ -180,7 +180,7 @@ const emitEventToActiveTabs = (message) => { const { action, params } = message; chrome.tabs.query({ active: true }, function (tabs) { tabs.forEach(function (tab) { - chrome.tabs.sendMessage(tab.id, { type: 'PandaEmitEvent', action, params }); + chrome.tabs.sendMessage(tab.id, { type: 'YoursEmitEvent', action, params }); }); }); return true; @@ -583,11 +583,11 @@ const processGetSignaturesRequest = (message, sendResponse) => { }; const processGetSocialProfileRequest = (sendResponse) => { - const HOSTED_PANDA_IMAGE = 'https://i.ibb.co/3fLL5X2/Panda-Wallet-Logo.png'; + const HOSTED_YOURS_IMAGE = 'https://i.ibb.co/zGcthBv/yours-org-light.png'; try { chrome.storage.local.get(['socialProfile'], (result) => { const displayName = result?.socialProfile?.displayName ? result.socialProfile.displayName : 'Anon Panda'; - const avatar = result?.socialProfile?.avatar ? result.socialProfile.avatar : HOSTED_PANDA_IMAGE; + const avatar = result?.socialProfile?.avatar ? result.socialProfile.avatar : HOSTED_YOURS_IMAGE; sendResponse({ type: 'getSocialProfile', success: true, @@ -646,7 +646,7 @@ const processGetTaggedKeys = async (message, sendResponse) => { sendResponse({ type: 'getTaggedKeys', success: false, - error: 'Unauthorized! Panda is locked.', + error: 'Unauthorized! Yours Wallet is locked.', }); } diff --git a/public/content.js b/public/content.js index 4cfe4f59..d15d1873 100644 --- a/public/content.js +++ b/public/content.js @@ -1,12 +1,12 @@ /* global chrome */ -console.log('🐼 Panda Wallet Loaded'); +console.log('🌱 Yours Wallet Loaded'); const script = document.createElement('script'); script.src = chrome.runtime.getURL('inject.js'); (document.head || document.documentElement).appendChild(script); -document.addEventListener('PandaRequest', (e) => { +document.addEventListener('YoursRequest', (e) => { if (!e?.detail?.type) return; const { type, params: originalParams = {} } = e.detail; @@ -40,7 +40,7 @@ const buildResponseCallback = (messageId) => { chrome.runtime.onMessage.addListener((message) => { const { type, action, params } = message; - if (type === 'PandaEmitEvent') { + if (type === 'YoursEmitEvent') { const event = new CustomEvent(type, { detail: { action, params } }); document.dispatchEvent(event); } diff --git a/public/inject.js b/public/inject.js index 7a60720f..a213dc35 100644 --- a/public/inject.js +++ b/public/inject.js @@ -1,9 +1,9 @@ -const createPandaMethod = (type) => { +const createYoursMethod = (type) => { return async (params) => { return new Promise((resolve, reject) => { // Send request const messageId = `${type}-${Date.now()}-${Math.random()}`; - const requestEvent = new CustomEvent('PandaRequest', { + const requestEvent = new CustomEvent('YoursRequest', { detail: { messageId, type, params }, }); document.dispatchEvent(requestEvent); @@ -24,7 +24,7 @@ const createPandaMethod = (type) => { }; }; -const createPandaEventEmitter = () => { +const createYoursEventEmitter = () => { const eventListeners = new Map(); // Object to store event listeners const whitelistedEvents = ['signedOut', 'networkChanged']; // Whitelisted event names @@ -64,35 +64,35 @@ const createPandaEventEmitter = () => { const provider = { isReady: true, - ...createPandaEventEmitter(), - connect: createPandaMethod('connect'), - disconnect: createPandaMethod('disconnect'), - isConnected: createPandaMethod('isConnected'), - getPubKeys: createPandaMethod('getPubKeys'), - getAddresses: createPandaMethod('getAddresses'), - getNetwork: createPandaMethod('getNetwork'), - getBalance: createPandaMethod('getBalance'), - getOrdinals: createPandaMethod('getOrdinals'), - sendBsv: createPandaMethod('sendBsv'), - transferOrdinal: createPandaMethod('transferOrdinal'), - signMessage: createPandaMethod('signMessage'), - broadcast: createPandaMethod('broadcast'), - getSignatures: createPandaMethod('getSignatures'), - getSocialProfile: createPandaMethod('getSocialProfile'), - getPaymentUtxos: createPandaMethod('getPaymentUtxos'), - getExchangeRate: createPandaMethod('getExchangeRate'), - purchaseOrdinal: createPandaMethod('purchaseOrdinal'), - generateTaggedKeys: createPandaMethod('generateTaggedKeys'), - getTaggedKeys: createPandaMethod('getTaggedKeys'), - inscribe: createPandaMethod('sendBsv'), - encrypt: createPandaMethod('encrypt'), - decrypt: createPandaMethod('decrypt'), + ...createYoursEventEmitter(), + connect: createYoursMethod('connect'), + disconnect: createYoursMethod('disconnect'), + isConnected: createYoursMethod('isConnected'), + getPubKeys: createYoursMethod('getPubKeys'), + getAddresses: createYoursMethod('getAddresses'), + getNetwork: createYoursMethod('getNetwork'), + getBalance: createYoursMethod('getBalance'), + getOrdinals: createYoursMethod('getOrdinals'), + sendBsv: createYoursMethod('sendBsv'), + transferOrdinal: createYoursMethod('transferOrdinal'), + signMessage: createYoursMethod('signMessage'), + broadcast: createYoursMethod('broadcast'), + getSignatures: createYoursMethod('getSignatures'), + getSocialProfile: createYoursMethod('getSocialProfile'), + getPaymentUtxos: createYoursMethod('getPaymentUtxos'), + getExchangeRate: createYoursMethod('getExchangeRate'), + purchaseOrdinal: createYoursMethod('purchaseOrdinal'), + generateTaggedKeys: createYoursMethod('generateTaggedKeys'), + getTaggedKeys: createYoursMethod('getTaggedKeys'), + inscribe: createYoursMethod('sendBsv'), + encrypt: createYoursMethod('encrypt'), + decrypt: createYoursMethod('decrypt'), }; window.panda = provider; window.yours = provider; -document.addEventListener('PandaEmitEvent', (event) => { +document.addEventListener('YoursEmitEvent', (event) => { const { action, params } = event.detail; // Check if window.panda is defined and has event listeners for the action if (window.panda && window.panda.eventListeners && window.panda.eventListeners.has(action)) { @@ -102,7 +102,7 @@ document.addEventListener('PandaEmitEvent', (event) => { } }); -document.addEventListener('PandaEmitEvent', (event) => { +document.addEventListener('YoursEmitEvent', (event) => { const { action, params } = event.detail; // Check if window.yours is defined and has event listeners for the action if (window.yours && window.yours.eventListeners && window.yours.eventListeners.has(action)) { diff --git a/src/assets/panda-logo-wide.png b/src/assets/panda-logo-wide.png deleted file mode 100644 index 200568f23a30bab0e074a3e0a062688b4ac3db9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17678 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 F|1Shm`~Cm` diff --git a/src/components/PandaHead.tsx b/src/components/YoursIcon.tsx similarity index 87% rename from src/components/PandaHead.tsx rename to src/components/YoursIcon.tsx index 81a69362..af7d7440 100644 --- a/src/components/PandaHead.tsx +++ b/src/components/YoursIcon.tsx @@ -1,8 +1,8 @@ import { useState, useRef, useEffect } from 'react'; import styled from 'styled-components'; -import panda from '../assets/panda.svg'; +import yoursLogo from '../assets/yours-logo.png'; -const PandaImg = styled.img<{ +const Yoursmg = styled.img<{ $rotation: { x: number; y: number }; }>` transition: transform 0.1s; @@ -15,14 +15,14 @@ interface Rotation { y: number; } -export type PandaHeadProps = { +export type YoursIconProps = { /** The size of the head */ width?: string; /** Whether or not the head should follow the mouse */ animated?: boolean; }; -export const PandaHead = (props: PandaHeadProps) => { +export const YoursIcon = (props: YoursIconProps) => { const { animated, width } = props; const [rotation, setRotation] = useState({ x: 0, y: 0 }); const imgRef = useRef(null); @@ -55,11 +55,11 @@ export const PandaHead = (props: PandaHeadProps) => { }, [animated]); return ( - { const [lockData, setLockData] = useState({ totalLocked: 0, unlockable: 0, nextUnlock: 0 }); const { retrieveKeys, bsvAddress, verifyPassword, bsvPubKey, identityAddress, identityPubKey } = useKeys(); const { network } = useNetwork(); - const { broadcastWithGorillaPool, getTxOut, getLockedUtxos, getSpentTxids } = useGorillaPool(); + const { broadcastWithGorillaPool, getTxOut, getLockedBsvUtxos, getSpentTxids } = useGorillaPool(); const { getUtxos, getBsvBalance, getExchangeRate, getInputs, getChainInfo } = useWhatsOnChain(); const { unlock } = useContracts(); @@ -146,7 +146,7 @@ export const useBsv = () => { const unlockLockedCoins = async (balanceOnly = false) => { if (!identityAddress) return; const chainInfo = await getChainInfo(); - let lockedTxos = await getLockedUtxos(identityAddress); + let lockedTxos = await getLockedBsvUtxos(identityAddress); const blockHeight = Number(chainInfo?.blocks); const outpoints = lockedTxos.map((txo) => txo.outpoint.toString()); const spentTxids = await getSpentTxids(outpoints); diff --git a/src/hooks/useContracts.ts b/src/hooks/useContracts.ts index 80c990e9..fa638cdb 100644 --- a/src/hooks/useContracts.ts +++ b/src/hooks/useContracts.ts @@ -58,7 +58,7 @@ const DEFAULT_SIGHASH_TYPE = 65; // SIGHASH_ALL | SIGHASH_FORKID export const useContracts = () => { const [isProcessing, setIsProcessing] = useState(false); - const { retrieveKeys, bsvAddress, ordAddress, verifyPassword } = useKeys(); + const { retrieveKeys, bsvAddress, ordAddress, verifyPassword, identityAddress } = useKeys(); const { broadcastWithGorillaPool } = useGorillaPool(); /** @@ -90,6 +90,9 @@ export const useContracts = () => { if (addr === ordAddress) { return PrivateKey.from_wif(keys.ordWif!); } + if (addr === identityAddress) { + return PrivateKey.from_wif(keys.identityWif!); + } throw new Error('unknown-address', { cause: addr }); }); }; diff --git a/src/hooks/useGorillaPool.ts b/src/hooks/useGorillaPool.ts index 6668a1da..db72ffa7 100644 --- a/src/hooks/useGorillaPool.ts +++ b/src/hooks/useGorillaPool.ts @@ -232,7 +232,7 @@ export const useGorillaPool = () => { } }; - const getLockedUtxos = async (address: string) => { + const getLockedBsvUtxos = async (address: string) => { try { if (!isAddressOnRightNetwork(address)) return []; //TODO: use this instead of test endpoint - `${getOrdinalsBaseUrl()}/api/locks/address/${address}/unspent?limit=100&offset=0` @@ -240,7 +240,7 @@ export const useGorillaPool = () => { `${getOrdinalsBaseUrl()}/api/locks/address/${address}/unspent?limit=100&offset=0`, ); const lockedUtxos: OrdinalTxo[] = data; - return lockedUtxos; + return lockedUtxos.filter((utxo) => !utxo.data?.bsv20); } catch (e) { throw new Error(JSON.stringify(e)); } @@ -390,7 +390,7 @@ export const useGorillaPool = () => { getMarketData, getBsv20Balances, getBSV20Utxos, - getLockedUtxos, + getLockedBsvUtxos, getSpentTxids, submitTx, getOrdContentByOriginOutpoint, diff --git a/src/hooks/useSocialProfile.ts b/src/hooks/useSocialProfile.ts index 791c71f3..647f0a48 100644 --- a/src/hooks/useSocialProfile.ts +++ b/src/hooks/useSocialProfile.ts @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { HOSTED_PANDA_IMAGE } from '../utils/constants'; +import { HOSTED_YOURS_IMAGE } from '../utils/constants'; import { storage } from '../utils/storage'; export type SocialProfile = { @@ -10,7 +10,7 @@ export type SocialProfile = { export const useSocialProfile = () => { const [socialProfile, setSocialProfile] = useState({ displayName: 'Anon Panda', - avatar: HOSTED_PANDA_IMAGE, + avatar: HOSTED_YOURS_IMAGE, }); useEffect(() => { diff --git a/src/pages/AppsAndTools.tsx b/src/pages/AppsAndTools.tsx index 8bb7bab7..53ca9cc6 100644 --- a/src/pages/AppsAndTools.tsx +++ b/src/pages/AppsAndTools.tsx @@ -20,8 +20,8 @@ import { useGorillaPool } from '../hooks/useGorillaPool'; import { useTheme } from '../hooks/useTheme'; import { useWhatsOnChain } from '../hooks/useWhatsOnChain'; import { ColorThemeProps } from '../theme'; -// import { BSV_DECIMAL_CONVERSION, PANDA_DEV_WALLET, PROVIDER_DOCS_URL, featuredApps } from '../utils/constants'; -import { BSV_DECIMAL_CONVERSION, featuredApps, YOURS_GITHUB_REPOS, PANDA_GITHUB_REPO } from '../utils/constants'; +// import { BSV_DECIMAL_CONVERSION, YOURS_DEV_WALLET, PROVIDER_DOCS_URL, featuredApps } from '../utils/constants'; +import { BSV_DECIMAL_CONVERSION, featuredApps, YOURS_GITHUB_REPOS, YOURS_GITHUB_REPO } from '../utils/constants'; import { truncate } from '../utils/format'; // import { BsvSendRequest } from './requests/BsvSendRequest'; import { TopNav } from '../components/TopNav'; @@ -132,7 +132,7 @@ export const AppsAndTools = () => { const { setSelected, query } = useBottomMenu(); // const { exchangeRate, identityAddress } = useBsv(); const { identityAddress } = useBsv(); - const { getLockedUtxos, getSpentTxids } = useGorillaPool(); + const { getLockedBsvUtxos, getSpentTxids } = useGorillaPool(); const { getChainInfo } = useWhatsOnChain(); const { isProcessing, setIsProcessing } = useContracts(); const [page, setPage] = useState(query === 'pending-locks' ? 'unlock' : 'main'); @@ -147,7 +147,7 @@ export const AppsAndTools = () => { setIsProcessing(true); if (!identityAddress) throw Error('Identity address missing!'); const chainInfo = await getChainInfo(); - let lockedTxos = await getLockedUtxos(identityAddress); + let lockedTxos = await getLockedBsvUtxos(identityAddress); const blockHeight = Number(chainInfo?.blocks); if (blockHeight) setCurrentBlockHeight(blockHeight); const outpoints = lockedTxos.map((txo) => txo.outpoint.toString()); @@ -184,7 +184,7 @@ export const AppsAndTools = () => { <> {/* setPage('sponsor')} jsxElement={} /> */} @@ -196,14 +196,14 @@ export const AppsAndTools = () => { /> setPage('discover-apps')} jsxElement={} /> window.open(PANDA_GITHUB_REPO, '_blank')} + onClick={() => window.open(YOURS_GITHUB_REPO, '_blank')} jsxElement={} /> @@ -347,7 +347,7 @@ export const AppsAndTools = () => { // // // - // Give Monthly through Panda Wallet's transparent Open Collective. + // Give Monthly through Yours Wallet's transparent Open Collective. // //