diff --git a/package.json b/package.json index d6706f7..19b088d 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@stellar/freighter-api": "^6.0.1", "react": "^19.2.4", "react-dom": "^19.2.4" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4c50b6..0fd678a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@stellar/freighter-api': + specifier: ^6.0.1 + version: 6.0.1 react: specifier: ^19.2.4 version: 19.2.5 @@ -319,6 +322,9 @@ packages: '@rolldown/pluginutils@1.0.0-rc.7': resolution: {integrity: sha512-qujRfC8sFVInYSPPMLQByRh7zhwkGFS4+tyMQ83srV1qrxL4g8E2tyxVVyxd0+8QeBM1mIk9KbWxkegRr76XzA==} + '@stellar/freighter-api@6.0.1': + resolution: {integrity: sha512-eqwakEqSg+zoLuPpSbKyrX0pG8DQFzL/J5GtbfuMCmJI+h+oiC9pQ5C6QLc80xopZQKdGt8dUAFCmDMNdAG95w==} + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -445,6 +451,9 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + baseline-browser-mapping@2.10.17: resolution: {integrity: sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA==} engines: {node: '>=6.0.0'} @@ -462,6 +471,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -644,6 +656,9 @@ packages: hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -880,6 +895,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + semver@7.7.4: resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} engines: {node: '>=10'} @@ -1273,6 +1293,11 @@ snapshots: '@rolldown/pluginutils@1.0.0-rc.7': {} + '@stellar/freighter-api@6.0.1': + dependencies: + buffer: 6.0.3 + semver: 7.7.1 + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -1422,6 +1447,8 @@ snapshots: balanced-match@4.0.4: {} + base64-js@1.5.1: {} + baseline-browser-mapping@2.10.17: {} brace-expansion@1.1.13: @@ -1441,6 +1468,11 @@ snapshots: node-releases: 2.0.37 update-browserslist-db: 1.2.3(browserslist@4.28.2) + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + callsites@3.1.0: {} caniuse-lite@1.0.30001787: {} @@ -1614,6 +1646,8 @@ snapshots: dependencies: hermes-estree: 0.25.1 + ieee754@1.2.1: {} + ignore@5.3.2: {} ignore@7.0.5: {} @@ -1808,6 +1842,8 @@ snapshots: semver@6.3.1: {} + semver@7.7.1: {} + semver@7.7.4: {} shebang-command@2.0.0: diff --git a/src/components/WalletConnect.tsx b/src/components/WalletConnect.tsx new file mode 100644 index 0000000..2ddc314 --- /dev/null +++ b/src/components/WalletConnect.tsx @@ -0,0 +1,54 @@ +import { useState } from 'react'; +import { isConnected, requestAccess, getAddress } from '@stellar/freighter-api'; + +export default function WalletConnect() { + const [address, setAddress] = useState(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + async function connectWallet() { + setLoading(true); + setError(null); + try { + const connected = await isConnected(); + if (!connected.isConnected) { + setError('Freighter not found. Please install it.'); + return; + } + await requestAccess(); + const addressObj = await getAddress(); + if (addressObj.error) { + setError('Failed to get address.'); + return; + } + setAddress(addressObj.address); + } catch { + setError('Failed to connect wallet.'); + } finally { + setLoading(false); + } + } + + function truncate(addr: string) { + return `${addr.slice(0, 4)}...${addr.slice(-4)}`; + } + + return ( +
+ {address ? ( +
+ ✅ {truncate(address)} +
+ ) : ( + + )} + {error &&

{error}

} +
+ ); +} \ No newline at end of file