Compare commits

..
25 changed files with 367 additions and 283 deletions
Generated
+78 -78
View File
@@ -34,7 +34,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@keplr-wallet/proto-types", "npm:0.11.25"],\
["@keplr-wallet/types", "npm:0.11.25"],\
["@next/eslint-plugin-next", "npm:13.0.5"],\
["@sentry/nextjs", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.27.0"],\
["@sentry/nextjs", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.29.0"],\
["@svgr/webpack", "npm:6.5.1"],\
["@types/cors", "npm:2.8.13"],\
["@types/eslint", "npm:8.4.10"],\
@@ -3331,10 +3331,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "SOFT"\
}],\
["virtual:e9c3f4450835355c1308c5ec6b0a06961dea09cc1cbf5a2c356d2c2179b00f6666bd54ef0244e47c45a539436800a0d785ea018febc600fdf27dce27b78ada2e#npm:4.0.4", {\
"packageLocation": "./.yarn/__virtual__/@rollup-plugin-sucrase-virtual-a5fe52f236/0/cache/@rollup-plugin-sucrase-npm-4.0.4-11cf77c62a-ccb01d7eb3.zip/node_modules/@rollup/plugin-sucrase/",\
["virtual:3a604504e8aeb5a25f89876693f61efac71df23354cdd05c30fd720452c63e2fd2009e86f2ccfed8beabdfc4c56217629b749f34209c39d40c7a340bdd27b375#npm:4.0.4", {\
"packageLocation": "./.yarn/__virtual__/@rollup-plugin-sucrase-virtual-c051ec3c0c/0/cache/@rollup-plugin-sucrase-npm-4.0.4-11cf77c62a-ccb01d7eb3.zip/node_modules/@rollup/plugin-sucrase/",\
"packageDependencies": [\
["@rollup/plugin-sucrase", "virtual:e9c3f4450835355c1308c5ec6b0a06961dea09cc1cbf5a2c356d2c2179b00f6666bd54ef0244e47c45a539436800a0d785ea018febc600fdf27dce27b78ada2e#npm:4.0.4"],\
["@rollup/plugin-sucrase", "virtual:3a604504e8aeb5a25f89876693f61efac71df23354cdd05c30fd720452c63e2fd2009e86f2ccfed8beabdfc4c56217629b749f34209c39d40c7a340bdd27b375#npm:4.0.4"],\
["@rollup/pluginutils", "npm:4.2.1"],\
["@types/rollup", null],\
["rollup", "npm:2.78.0"],\
@@ -3355,10 +3355,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "SOFT"\
}],\
["virtual:e9c3f4450835355c1308c5ec6b0a06961dea09cc1cbf5a2c356d2c2179b00f6666bd54ef0244e47c45a539436800a0d785ea018febc600fdf27dce27b78ada2e#npm:3.0.0", {\
"packageLocation": "./.yarn/__virtual__/@rollup-plugin-virtual-virtual-683e923f4b/0/cache/@rollup-plugin-virtual-npm-3.0.0-678cdc8578-2335cabee2.zip/node_modules/@rollup/plugin-virtual/",\
["virtual:3a604504e8aeb5a25f89876693f61efac71df23354cdd05c30fd720452c63e2fd2009e86f2ccfed8beabdfc4c56217629b749f34209c39d40c7a340bdd27b375#npm:3.0.0", {\
"packageLocation": "./.yarn/__virtual__/@rollup-plugin-virtual-virtual-c251801d05/0/cache/@rollup-plugin-virtual-npm-3.0.0-678cdc8578-2335cabee2.zip/node_modules/@rollup/plugin-virtual/",\
"packageDependencies": [\
["@rollup/plugin-virtual", "virtual:e9c3f4450835355c1308c5ec6b0a06961dea09cc1cbf5a2c356d2c2179b00f6666bd54ef0244e47c45a539436800a0d785ea018febc600fdf27dce27b78ada2e#npm:3.0.0"],\
["@rollup/plugin-virtual", "virtual:3a604504e8aeb5a25f89876693f61efac71df23354cdd05c30fd720452c63e2fd2009e86f2ccfed8beabdfc4c56217629b749f34209c39d40c7a340bdd27b375#npm:3.0.0"],\
["@types/rollup", null],\
["rollup", "npm:2.78.0"]\
],\
@@ -3413,14 +3413,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@sentry/browser", [\
["npm:7.27.0", {\
"packageLocation": "./.yarn/cache/@sentry-browser-npm-7.27.0-21601bd9f9-da5e50bd57.zip/node_modules/@sentry/browser/",\
["npm:7.29.0", {\
"packageLocation": "./.yarn/cache/@sentry-browser-npm-7.29.0-93fbe26bf6-136b9d03a9.zip/node_modules/@sentry/browser/",\
"packageDependencies": [\
["@sentry/browser", "npm:7.27.0"],\
["@sentry/core", "npm:7.27.0"],\
["@sentry/replay", "virtual:21601bd9f91dad7312f712f5400c693cac4ca00856456090469b4d7eeb106b080cca0a5e44daaf28693eb0205ad0dbe83cb5230d76d15cf004c44ddb74f24ecf#npm:7.27.0"],\
["@sentry/types", "npm:7.27.0"],\
["@sentry/utils", "npm:7.27.0"],\
["@sentry/browser", "npm:7.29.0"],\
["@sentry/core", "npm:7.29.0"],\
["@sentry/replay", "virtual:93fbe26bf62b342ef21729e6d406a0883ac6b2fc17e249df9fefb2776d07612931a56ff4fa8e79c5a58b9f975dd0395c18b7b90d36df66d3c8e541f31098bb2c#npm:7.29.0"],\
["@sentry/types", "npm:7.29.0"],\
["@sentry/utils", "npm:7.29.0"],\
["tslib", "npm:1.14.1"]\
],\
"linkType": "HARD"\
@@ -3443,24 +3443,24 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@sentry/core", [\
["npm:7.27.0", {\
"packageLocation": "./.yarn/cache/@sentry-core-npm-7.27.0-72a2ae90aa-36138a8f43.zip/node_modules/@sentry/core/",\
["npm:7.29.0", {\
"packageLocation": "./.yarn/cache/@sentry-core-npm-7.29.0-acfa631d1a-d9330ed352.zip/node_modules/@sentry/core/",\
"packageDependencies": [\
["@sentry/core", "npm:7.27.0"],\
["@sentry/types", "npm:7.27.0"],\
["@sentry/utils", "npm:7.27.0"],\
["@sentry/core", "npm:7.29.0"],\
["@sentry/types", "npm:7.29.0"],\
["@sentry/utils", "npm:7.29.0"],\
["tslib", "npm:1.14.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["@sentry/integrations", [\
["npm:7.27.0", {\
"packageLocation": "./.yarn/cache/@sentry-integrations-npm-7.27.0-b9d35a9a46-26cc2a10a4.zip/node_modules/@sentry/integrations/",\
["npm:7.29.0", {\
"packageLocation": "./.yarn/cache/@sentry-integrations-npm-7.29.0-1e78ee183b-fec2b9b790.zip/node_modules/@sentry/integrations/",\
"packageDependencies": [\
["@sentry/integrations", "npm:7.27.0"],\
["@sentry/types", "npm:7.27.0"],\
["@sentry/utils", "npm:7.27.0"],\
["@sentry/integrations", "npm:7.29.0"],\
["@sentry/types", "npm:7.29.0"],\
["@sentry/utils", "npm:7.29.0"],\
["localforage", "npm:1.10.0"],\
["tslib", "npm:1.14.1"]\
],\
@@ -3468,26 +3468,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@sentry/nextjs", [\
["npm:7.27.0", {\
"packageLocation": "./.yarn/cache/@sentry-nextjs-npm-7.27.0-1e548cf282-fdc0ba40b4.zip/node_modules/@sentry/nextjs/",\
["npm:7.29.0", {\
"packageLocation": "./.yarn/cache/@sentry-nextjs-npm-7.29.0-32ea7a99ed-53864f15c1.zip/node_modules/@sentry/nextjs/",\
"packageDependencies": [\
["@sentry/nextjs", "npm:7.27.0"]\
["@sentry/nextjs", "npm:7.29.0"]\
],\
"linkType": "SOFT"\
}],\
["virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.27.0", {\
"packageLocation": "./.yarn/__virtual__/@sentry-nextjs-virtual-e9c3f44508/0/cache/@sentry-nextjs-npm-7.27.0-1e548cf282-fdc0ba40b4.zip/node_modules/@sentry/nextjs/",\
["virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.29.0", {\
"packageLocation": "./.yarn/__virtual__/@sentry-nextjs-virtual-3a604504e8/0/cache/@sentry-nextjs-npm-7.29.0-32ea7a99ed-53864f15c1.zip/node_modules/@sentry/nextjs/",\
"packageDependencies": [\
["@sentry/nextjs", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.27.0"],\
["@rollup/plugin-sucrase", "virtual:e9c3f4450835355c1308c5ec6b0a06961dea09cc1cbf5a2c356d2c2179b00f6666bd54ef0244e47c45a539436800a0d785ea018febc600fdf27dce27b78ada2e#npm:4.0.4"],\
["@rollup/plugin-virtual", "virtual:e9c3f4450835355c1308c5ec6b0a06961dea09cc1cbf5a2c356d2c2179b00f6666bd54ef0244e47c45a539436800a0d785ea018febc600fdf27dce27b78ada2e#npm:3.0.0"],\
["@sentry/core", "npm:7.27.0"],\
["@sentry/integrations", "npm:7.27.0"],\
["@sentry/node", "npm:7.27.0"],\
["@sentry/react", "virtual:e9c3f4450835355c1308c5ec6b0a06961dea09cc1cbf5a2c356d2c2179b00f6666bd54ef0244e47c45a539436800a0d785ea018febc600fdf27dce27b78ada2e#npm:7.27.0"],\
["@sentry/tracing", "npm:7.27.0"],\
["@sentry/types", "npm:7.27.0"],\
["@sentry/utils", "npm:7.27.0"],\
["@sentry/nextjs", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.29.0"],\
["@rollup/plugin-sucrase", "virtual:3a604504e8aeb5a25f89876693f61efac71df23354cdd05c30fd720452c63e2fd2009e86f2ccfed8beabdfc4c56217629b749f34209c39d40c7a340bdd27b375#npm:4.0.4"],\
["@rollup/plugin-virtual", "virtual:3a604504e8aeb5a25f89876693f61efac71df23354cdd05c30fd720452c63e2fd2009e86f2ccfed8beabdfc4c56217629b749f34209c39d40c7a340bdd27b375#npm:3.0.0"],\
["@sentry/core", "npm:7.29.0"],\
["@sentry/integrations", "npm:7.29.0"],\
["@sentry/node", "npm:7.29.0"],\
["@sentry/react", "virtual:3a604504e8aeb5a25f89876693f61efac71df23354cdd05c30fd720452c63e2fd2009e86f2ccfed8beabdfc4c56217629b749f34209c39d40c7a340bdd27b375#npm:7.29.0"],\
["@sentry/tracing", "npm:7.29.0"],\
["@sentry/types", "npm:7.29.0"],\
["@sentry/utils", "npm:7.29.0"],\
["@sentry/webpack-plugin", "npm:1.20.0"],\
["@types/next", null],\
["@types/react", "npm:18.0.25"],\
@@ -3511,13 +3511,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@sentry/node", [\
["npm:7.27.0", {\
"packageLocation": "./.yarn/cache/@sentry-node-npm-7.27.0-f1028265b5-a42cb398ed.zip/node_modules/@sentry/node/",\
["npm:7.29.0", {\
"packageLocation": "./.yarn/cache/@sentry-node-npm-7.29.0-4b46c521c4-1669d47dfa.zip/node_modules/@sentry/node/",\
"packageDependencies": [\
["@sentry/node", "npm:7.27.0"],\
["@sentry/core", "npm:7.27.0"],\
["@sentry/types", "npm:7.27.0"],\
["@sentry/utils", "npm:7.27.0"],\
["@sentry/node", "npm:7.29.0"],\
["@sentry/core", "npm:7.29.0"],\
["@sentry/types", "npm:7.29.0"],\
["@sentry/utils", "npm:7.29.0"],\
["cookie", "npm:0.4.2"],\
["https-proxy-agent", "npm:5.0.1"],\
["lru_map", "npm:0.3.3"],\
@@ -3527,20 +3527,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@sentry/react", [\
["npm:7.27.0", {\
"packageLocation": "./.yarn/cache/@sentry-react-npm-7.27.0-17a03112ea-164cefe9ef.zip/node_modules/@sentry/react/",\
["npm:7.29.0", {\
"packageLocation": "./.yarn/cache/@sentry-react-npm-7.29.0-8919016525-022bf398f2.zip/node_modules/@sentry/react/",\
"packageDependencies": [\
["@sentry/react", "npm:7.27.0"]\
["@sentry/react", "npm:7.29.0"]\
],\
"linkType": "SOFT"\
}],\
["virtual:e9c3f4450835355c1308c5ec6b0a06961dea09cc1cbf5a2c356d2c2179b00f6666bd54ef0244e47c45a539436800a0d785ea018febc600fdf27dce27b78ada2e#npm:7.27.0", {\
"packageLocation": "./.yarn/__virtual__/@sentry-react-virtual-b11fda8097/0/cache/@sentry-react-npm-7.27.0-17a03112ea-164cefe9ef.zip/node_modules/@sentry/react/",\
["virtual:3a604504e8aeb5a25f89876693f61efac71df23354cdd05c30fd720452c63e2fd2009e86f2ccfed8beabdfc4c56217629b749f34209c39d40c7a340bdd27b375#npm:7.29.0", {\
"packageLocation": "./.yarn/__virtual__/@sentry-react-virtual-9acab97880/0/cache/@sentry-react-npm-7.29.0-8919016525-022bf398f2.zip/node_modules/@sentry/react/",\
"packageDependencies": [\
["@sentry/react", "virtual:e9c3f4450835355c1308c5ec6b0a06961dea09cc1cbf5a2c356d2c2179b00f6666bd54ef0244e47c45a539436800a0d785ea018febc600fdf27dce27b78ada2e#npm:7.27.0"],\
["@sentry/browser", "npm:7.27.0"],\
["@sentry/types", "npm:7.27.0"],\
["@sentry/utils", "npm:7.27.0"],\
["@sentry/react", "virtual:3a604504e8aeb5a25f89876693f61efac71df23354cdd05c30fd720452c63e2fd2009e86f2ccfed8beabdfc4c56217629b749f34209c39d40c7a340bdd27b375#npm:7.29.0"],\
["@sentry/browser", "npm:7.29.0"],\
["@sentry/types", "npm:7.29.0"],\
["@sentry/utils", "npm:7.29.0"],\
["@types/react", "npm:18.0.25"],\
["hoist-non-react-statics", "npm:3.3.2"],\
["react", "npm:18.2.0"],\
@@ -3554,21 +3554,21 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@sentry/replay", [\
["npm:7.27.0", {\
"packageLocation": "./.yarn/cache/@sentry-replay-npm-7.27.0-18656992dc-440ac09c9a.zip/node_modules/@sentry/replay/",\
["npm:7.29.0", {\
"packageLocation": "./.yarn/cache/@sentry-replay-npm-7.29.0-e553e78caf-539e18c128.zip/node_modules/@sentry/replay/",\
"packageDependencies": [\
["@sentry/replay", "npm:7.27.0"]\
["@sentry/replay", "npm:7.29.0"]\
],\
"linkType": "SOFT"\
}],\
["virtual:21601bd9f91dad7312f712f5400c693cac4ca00856456090469b4d7eeb106b080cca0a5e44daaf28693eb0205ad0dbe83cb5230d76d15cf004c44ddb74f24ecf#npm:7.27.0", {\
"packageLocation": "./.yarn/__virtual__/@sentry-replay-virtual-8f5e4cea4f/0/cache/@sentry-replay-npm-7.27.0-18656992dc-440ac09c9a.zip/node_modules/@sentry/replay/",\
["virtual:93fbe26bf62b342ef21729e6d406a0883ac6b2fc17e249df9fefb2776d07612931a56ff4fa8e79c5a58b9f975dd0395c18b7b90d36df66d3c8e541f31098bb2c#npm:7.29.0", {\
"packageLocation": "./.yarn/__virtual__/@sentry-replay-virtual-b637ba30d9/0/cache/@sentry-replay-npm-7.29.0-e553e78caf-539e18c128.zip/node_modules/@sentry/replay/",\
"packageDependencies": [\
["@sentry/replay", "virtual:21601bd9f91dad7312f712f5400c693cac4ca00856456090469b4d7eeb106b080cca0a5e44daaf28693eb0205ad0dbe83cb5230d76d15cf004c44ddb74f24ecf#npm:7.27.0"],\
["@sentry/browser", "npm:7.27.0"],\
["@sentry/core", "npm:7.27.0"],\
["@sentry/types", "npm:7.27.0"],\
["@sentry/utils", "npm:7.27.0"],\
["@sentry/replay", "virtual:93fbe26bf62b342ef21729e6d406a0883ac6b2fc17e249df9fefb2776d07612931a56ff4fa8e79c5a58b9f975dd0395c18b7b90d36df66d3c8e541f31098bb2c#npm:7.29.0"],\
["@sentry/browser", "npm:7.29.0"],\
["@sentry/core", "npm:7.29.0"],\
["@sentry/types", "npm:7.29.0"],\
["@sentry/utils", "npm:7.29.0"],\
["@types/sentry__browser", null]\
],\
"packagePeers": [\
@@ -3579,33 +3579,33 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@sentry/tracing", [\
["npm:7.27.0", {\
"packageLocation": "./.yarn/cache/@sentry-tracing-npm-7.27.0-7d217c54fa-203a3a6b46.zip/node_modules/@sentry/tracing/",\
["npm:7.29.0", {\
"packageLocation": "./.yarn/cache/@sentry-tracing-npm-7.29.0-16e145a1cc-7ad9040664.zip/node_modules/@sentry/tracing/",\
"packageDependencies": [\
["@sentry/tracing", "npm:7.27.0"],\
["@sentry/core", "npm:7.27.0"],\
["@sentry/types", "npm:7.27.0"],\
["@sentry/utils", "npm:7.27.0"],\
["@sentry/tracing", "npm:7.29.0"],\
["@sentry/core", "npm:7.29.0"],\
["@sentry/types", "npm:7.29.0"],\
["@sentry/utils", "npm:7.29.0"],\
["tslib", "npm:1.14.1"]\
],\
"linkType": "HARD"\
}]\
]],\
["@sentry/types", [\
["npm:7.27.0", {\
"packageLocation": "./.yarn/cache/@sentry-types-npm-7.27.0-67702fc3e1-a22056aa58.zip/node_modules/@sentry/types/",\
["npm:7.29.0", {\
"packageLocation": "./.yarn/cache/@sentry-types-npm-7.29.0-d6d116c884-53815b6666.zip/node_modules/@sentry/types/",\
"packageDependencies": [\
["@sentry/types", "npm:7.27.0"]\
["@sentry/types", "npm:7.29.0"]\
],\
"linkType": "HARD"\
}]\
]],\
["@sentry/utils", [\
["npm:7.27.0", {\
"packageLocation": "./.yarn/cache/@sentry-utils-npm-7.27.0-1935a93244-d01f2d1999.zip/node_modules/@sentry/utils/",\
["npm:7.29.0", {\
"packageLocation": "./.yarn/cache/@sentry-utils-npm-7.29.0-5dbf6566da-9914a21296.zip/node_modules/@sentry/utils/",\
"packageDependencies": [\
["@sentry/utils", "npm:7.27.0"],\
["@sentry/types", "npm:7.27.0"],\
["@sentry/utils", "npm:7.29.0"],\
["@sentry/types", "npm:7.29.0"],\
["tslib", "npm:1.14.1"]\
],\
"linkType": "HARD"\
@@ -7373,7 +7373,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@keplr-wallet/proto-types", "npm:0.11.25"],\
["@keplr-wallet/types", "npm:0.11.25"],\
["@next/eslint-plugin-next", "npm:13.0.5"],\
["@sentry/nextjs", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.27.0"],\
["@sentry/nextjs", "virtual:4b77e00d446246df1ed27001550885fbf1b51be18c660c1b5c357d3d763078ecef2a676194291a120f149b87573081e5af0621dc83cf1f83383639f39ac133c7#npm:7.29.0"],\
["@svgr/webpack", "npm:6.5.1"],\
["@types/cors", "npm:2.8.13"],\
["@types/eslint", "npm:8.4.10"],\
+2 -1
View File
@@ -23,7 +23,8 @@ class ErrorBoundary extends Component<Props, State> {
public componentDidCatch(error: Error, errorInfo: ErrorInfo) {
console.error("Uncaught error:", error, errorInfo);
captureException(error);
const errorMessage = error.message || error;
captureException(errorMessage);
}
public render() {
+48 -45
View File
@@ -8,16 +8,17 @@ import ICNSIcon from "../../public/images/svg/icns-logo.svg";
interface Props {
isOwner?: boolean;
registeredTwitterName?: string;
twitterProfileInformation?: TwitterAuthInfoResponse | null;
}
export const TwitterProfile: FunctionComponent<Props> = (props) => {
const { isOwner, twitterProfileInformation } = props;
const { isOwner, registeredTwitterName, twitterProfileInformation } = props;
const [isCopied, setIsCopied] = useState<boolean>(false);
const onClickInviteLink = async () => {
await navigator.clipboard.writeText(
`https://app.icns.xyz?referral=${twitterProfileInformation?.username}`,
`https://app.icns.xyz?referral=${registeredTwitterName}`,
);
setIsCopied(true);
@@ -29,49 +30,51 @@ export const TwitterProfile: FunctionComponent<Props> = (props) => {
return (
<ProfileContainer color={color.grey["900"]}>
{isCopied ? (
<InviteLinkContainer>
copied
<CopiedIcon
width="14"
height="12"
viewBox="0 0 14 12"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M2 4.92614L6.08333 9.9375L12.5 2.0625"
stroke="current"
strokeWidth="2"
strokeLinecap="square"
/>
</CopiedIcon>
</InviteLinkContainer>
) : (
<InviteLinkContainer onClick={onClickInviteLink}>
copy invite link
<CopyIcon
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="none"
viewBox="0 0 16 16"
>
<path
stroke="current"
strokeLinecap="square"
strokeWidth="1.5"
d="M10.667 2.667h-8v8"
/>
<path
stroke="current"
strokeLinecap="square"
strokeWidth="1.5"
d="M5.417 5.417H13.25V13.25H5.417z"
/>
</CopyIcon>
</InviteLinkContainer>
)}
{registeredTwitterName ? (
isCopied ? (
<InviteLinkContainer>
copied
<CopiedIcon
width="14"
height="12"
viewBox="0 0 14 12"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<path
d="M2 4.92614L6.08333 9.9375L12.5 2.0625"
stroke="current"
strokeWidth="2"
strokeLinecap="square"
/>
</CopiedIcon>
</InviteLinkContainer>
) : (
<InviteLinkContainer onClick={onClickInviteLink}>
copy invite link
<CopyIcon
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
fill="none"
viewBox="0 0 16 16"
>
<path
stroke="current"
strokeLinecap="square"
strokeWidth="1.5"
d="M10.667 2.667h-8v8"
/>
<path
stroke="current"
strokeLinecap="square"
strokeWidth="1.5"
d="M5.417 5.417H13.25V13.25H5.417z"
/>
</CopyIcon>
</InviteLinkContainer>
)
) : null}
<ProfileImageContainer>
<Image
src={twitterProfileInformation?.profile_image_url ?? ""}
+5 -6
View File
@@ -2,12 +2,11 @@
const { withSentryConfig } = require("@sentry/nextjs");
const nextConfig = {
sentry: {
hideSourceMaps: true,
},
api: {
externalResolver: true,
},
...(!!process.env.NEXT_PUBLIC_SENTRY_DSN && {
sentry: {
hideSourceMaps: true,
},
}),
reactStrictMode: false,
swcMinify: true,
compiler: {
+1 -1
View File
@@ -15,7 +15,7 @@
"@keplr-wallet/cosmos": "^0.11.25",
"@keplr-wallet/proto-types": "^0.11.25",
"@keplr-wallet/types": "^0.11.25",
"@sentry/nextjs": "^7.27.0",
"@sentry/nextjs": "^7.29.0",
"axios": "^0.27.2",
"buffer": "^6.0.3",
"cors": "^2.8.5",
+21 -10
View File
@@ -1,8 +1,7 @@
import { captureException } from "@sentry/nextjs";
import { withIronSessionApiRoute } from "iron-session/next";
import type { NextApiRequest, NextApiResponse } from "next";
import { ironOptions } from "../../iron.config";
import { IcnsVerificationResponse } from "../../types";
import { request } from "../../utils/url";
export default withIronSessionApiRoute(async function handler(
req: NextApiRequest,
@@ -10,30 +9,42 @@ export default withIronSessionApiRoute(async function handler(
) {
try {
if (!process.env.ICNS_VERIFIER_ORIGIN_LIST) {
console.log(".env is not set");
const errorMessage = ".env is not set";
console.error(errorMessage);
captureException(errorMessage);
return res.status(500).json({ error: "Internal server error" });
}
const verifierOriginList = process.env.ICNS_VERIFIER_ORIGIN_LIST.split(",");
const verificationList = await Promise.allSettled(
verifierOriginList.map((verfierOrigin) =>
request<IcnsVerificationResponse>(
`${verfierOrigin}/api/verify_twitter`,
{
verifierOriginList.map(async (verfierOrigin) =>
(
await fetch(`${verfierOrigin}/api/verify_twitter`, {
method: "post",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(req.body),
},
),
})
).json(),
),
);
const errorTrimmedVerificationList = verificationList.map(
(verification) => ({
...verification,
...(verification.status === "rejected" && {
reason: verification.reason.message || verification.reason,
}),
}),
);
res.status(200).json({
verificationList,
verificationList: errorTrimmedVerificationList,
});
} catch (error) {
console.error(error);
captureException(error);
res.status(500).json({ error: "Internal server error" });
}
},
+63 -35
View File
@@ -1,8 +1,8 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { captureException } from "@sentry/nextjs";
import { withIronSessionApiRoute } from "iron-session/next";
import { request } from "../../utils/url";
import { ironOptions } from "../../iron.config";
import type { NextApiRequest, NextApiResponse } from "next";
import { twitterApiBaseUrl } from "../../constants/twitter";
import { ironOptions } from "../../iron.config";
export default withIronSessionApiRoute(async function handler(
req: NextApiRequest,
@@ -45,53 +45,74 @@ export default withIronSessionApiRoute(async function handler(
params.append("code_verifier", req.session.code_verifier);
}
const { access_token: accessToken, refresh_token } =
await request<TwitterOAuth2TokenResponse>(
`${twitterApiBaseUrl}/oauth2/token`,
{
method: "post",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Authorization: `Basic ${Buffer.from(
`${process.env.TWITTER_CLIENT_ID}:${process.env.TWITTER_CLIENT_SECRET}`,
).toString("base64")}`,
},
body: params,
const {
access_token: accessToken,
refresh_token,
error: authTokenErrorTitle,
error_description: authTokenErrorDesc,
}: TwitterOAuth2TokenResponse = await (
await fetch(`${twitterApiBaseUrl}/oauth2/token`, {
method: "post",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Authorization: `Basic ${Buffer.from(
`${process.env.TWITTER_CLIENT_ID}:${process.env.TWITTER_CLIENT_SECRET}`,
).toString("base64")}`,
},
);
body: params,
})
).json();
if (authTokenErrorTitle) {
throw new Error(`${authTokenErrorTitle}: ${authTokenErrorDesc}`);
}
req.session.refresh_token = refresh_token;
await req.session.save();
const {
data: {
id,
username,
name,
profile_image_url,
description,
public_metrics,
},
} = await request<TwitterUsersMeResponse>(
`${twitterApiBaseUrl}/users/me?user.fields=profile_image_url,public_metrics,description`,
{
headers: {
Authorization: `Bearer ${accessToken}`,
data,
title: usersMeErrorTitle,
detail: usersMeErrorDesc,
}: TwitterUsersMeResponse = await (
await fetch(
`${twitterApiBaseUrl}/users/me?user.fields=profile_image_url,public_metrics,description`,
{
headers: {
Authorization: `Bearer ${accessToken}`,
},
},
},
);
)
).json();
if (usersMeErrorTitle) {
throw new Error(`${usersMeErrorTitle}: ${usersMeErrorDesc}`);
}
const {
id,
username,
name,
profile_image_url,
description,
public_metrics,
} = data || {};
res.status(200).json({
accessToken,
id,
username,
name,
profile_image_url: profile_image_url.replace("normal.jpg", "400x400.jpg"),
profile_image_url: profile_image_url?.replace(
"normal.jpg",
"400x400.jpg",
),
description,
public_metrics,
});
} catch (error) {
} catch (error: any) {
console.error(error);
res.status(500).json({ error: "Internal server error " });
captureException(error);
res.status(500).json({ error: error.message });
}
},
ironOptions);
@@ -102,10 +123,12 @@ interface TwitterOAuth2TokenResponse {
access_token: string;
scope: string;
refresh_token: string;
error?: string;
error_description?: string;
}
interface TwitterUsersMeResponse {
data: {
data?: {
id: string;
username: string;
name: string;
@@ -113,6 +136,11 @@ interface TwitterUsersMeResponse {
description: string;
public_metrics: TwitterPublicMetrics;
};
// Error data
title?: string;
detail?: string;
type?: string;
status?: string;
}
export interface TwitterPublicMetrics {
+6 -4
View File
@@ -1,13 +1,14 @@
import type { NextApiRequest, NextApiResponse } from "next";
import { captureException } from "@sentry/nextjs";
import crypto from "crypto";
import { withIronSessionApiRoute } from "iron-session/next";
import { base64URLEncode } from "../../utils/encoding";
import { buildQueryString } from "../../utils/url";
import { ironOptions } from "../../iron.config";
import type { NextApiRequest, NextApiResponse } from "next";
import {
twitterOAuthBaseUrl,
twitterOAuthScopes,
} from "../../constants/twitter";
import { ironOptions } from "../../iron.config";
import { base64URLEncode } from "../../utils/encoding";
import { buildQueryString } from "../../utils/url";
export default withIronSessionApiRoute(async function handler(
req: NextApiRequest,
@@ -46,6 +47,7 @@ export default withIronSessionApiRoute(async function handler(
res.status(200).json({ authUrl });
} catch (error) {
console.error(error);
captureException(error);
res.status(500).json({ error: "Internal server error" });
}
},
+19 -11
View File
@@ -106,6 +106,8 @@ export default function VerificationPage() {
const [searchValue, setSearchValue] = useState("");
const [nftOwnerAddress, setNFTOwnerAddress] = useState("");
// Handle the token id which actually registered.
const [registeredTwitterName, setRegisteredTwitterName] = useState("");
const [isOwner, setIsOwner] = useState(false);
const [isModalOpen, setModalOpen] = useState(false);
@@ -209,6 +211,13 @@ export default function VerificationPage() {
isRegistered: "data" in registeredQueryResponse,
});
if (
"data" in registeredQueryResponse &&
registeredQueryResponse.data?.name
) {
setRegisteredTwitterName(registeredQueryResponse.data.name);
}
if ("data" in registeredQueryResponse) {
const ownerOfQueryResponse = await queryOwnerOfTwitterName(
registeredQueryResponse.data.name,
@@ -230,13 +239,12 @@ export default function VerificationPage() {
}
} catch (error) {
if (error instanceof Error) {
if (error.message === TWITTER_LOGIN_ERROR) {
setErrorMessage({ message: TWITTER_LOGIN_ERROR, path: "/" });
setErrorModalOpen(true);
}
setErrorMessage({ message: error.message, path: "/" });
setErrorModalOpen(true);
}
console.error(error);
captureException(error);
} finally {
setIsLoadingInit(false);
}
@@ -383,6 +391,8 @@ export default function VerificationPage() {
twitterInfo.accessToken,
);
console.log("icnsVerificationList", icnsVerificationList);
icnsVerificationList.forEach((verification) => {
if (verification.status === "fulfilled") {
if (verification.value.errors.length > 0) {
@@ -395,8 +405,7 @@ export default function VerificationPage() {
if (verification.status === "rejected") {
if (verification.reason) {
const errorMessage =
verification.reason.message || verification.reason;
const errorMessage = verification.reason;
captureException(errorMessage);
}
}
@@ -434,8 +443,6 @@ export default function VerificationPage() {
rest: REST_URL,
};
console.log(aminoMsgs);
const simulated = await simulateMsgs(
chainInfo,
walletKey.bech32Address,
@@ -465,7 +472,7 @@ export default function VerificationPage() {
pathname: "complete",
query: {
txHash: Buffer.from(txHash).toString("hex"),
twitterUsername: twitterInfo.username,
twitterUsername: registeredTwitterName || twitterInfo.username,
},
});
}
@@ -497,10 +504,10 @@ export default function VerificationPage() {
return;
}
const errorMessage = error.message || error;
const errorMessage = (error?.response?.data as QueryError).message;
captureException(errorMessage);
setErrorMessage({
message: (error?.response?.data as QueryError).message,
message: errorMessage,
});
setErrorModalOpen(true);
return;
@@ -556,6 +563,7 @@ export default function VerificationPage() {
<BackButton />
<TwitterProfile
isOwner={isOwner}
registeredTwitterName={registeredTwitterName}
twitterProfileInformation={twitterAuthInfo}
/>
<ChainListTitleContainer>
+13 -10
View File
@@ -1,5 +1,5 @@
import {
IcnsVerificationResponse,
IcnsVerificationResponseOnFrontend,
TwitterAuthInfoResponse,
TwitterAuthUrlResponse,
} from "../types";
@@ -27,15 +27,18 @@ export const verifyTwitterAccount = async (
accessToken: string,
) => {
return (
await request<IcnsVerificationResponse>("/api/icns-verification", {
method: "post",
headers: {
"Content-Type": "application/json",
await request<IcnsVerificationResponseOnFrontend>(
"/api/icns-verification",
{
method: "post",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
claimer: claimer,
authToken: accessToken,
}),
},
body: JSON.stringify({
claimer: claimer,
authToken: accessToken,
}),
})
)
).verificationList;
};
+1 -1
View File
@@ -10,7 +10,7 @@ Sentry.init({
enabled: !!SENTRY_DSN,
dsn: SENTRY_DSN,
// Adjust this value in production, or use tracesSampler for greater control
tracesSampleRate: 1.0,
tracesSampleRate: 0.2,
// ...
// Note: if you want to override the automatic release value, do not set a
// `release` value here - use the environment variable `SENTRY_RELEASE`, so
+1 -1
View File
@@ -10,7 +10,7 @@ Sentry.init({
enabled: !!SENTRY_DSN,
dsn: SENTRY_DSN,
// Adjust this value in production, or use tracesSampler for greater control
tracesSampleRate: 1.0,
tracesSampleRate: 0.2,
// ...
// Note: if you want to override the automatic release value, do not set a
// `release` value here - use the environment variable `SENTRY_RELEASE`, so
+24
View File
@@ -38,6 +38,30 @@ export interface IcnsVerificationResponse {
)[];
}
export interface IcnsVerificationResponseOnFrontend {
verificationList: (
| {
status: "fulfilled";
value: {
errors: Error[];
data: {
// JSON string
verifying_msg: string;
// Base64 encoded
public_key: string;
// Base64 encoded
signature: string;
algorithm: string;
};
};
}
| {
status: "rejected";
reason: string;
}
)[];
}
export interface NameByTwitterIdQueryResponse {
data: {
name: string;
+16 -11
View File
@@ -2,23 +2,28 @@ import { TwitterLoginSuccess } from "../types";
import { TWITTER_LOGIN_ERROR } from "../constants/error-message";
import { WALLET_INSTALL_URL } from "../constants/wallet";
export function request<TResponse>(
export async function request<TResponse>(
url: string,
config: RequestInit = {},
customConfig?: {
isErrorIgnore?: boolean;
},
): Promise<TResponse> {
return fetch(url, config)
.then((response) => {
if (!response.ok && !customConfig?.isErrorIgnore) {
throw new Error(
`This is an HTTP error: The status is ${response.status} ${response.statusText}`,
);
}
return response.json();
})
.then((data) => data as TResponse);
const response = await fetch(url, config);
const data = await response.json();
if (
(!response.ok || data.error || data.errors) &&
!customConfig?.isErrorIgnore
) {
const { error, errors } = data;
const errorMessage =
(error && error.toString()) || (errors && errors.toString());
throw new Error(errorMessage);
}
return data;
}
export function buildQueryString(query: Record<string, any>): string {
+69 -69
View File
@@ -2166,16 +2166,16 @@ __metadata:
languageName: node
linkType: hard
"@sentry/browser@npm:7.27.0":
version: 7.27.0
resolution: "@sentry/browser@npm:7.27.0"
"@sentry/browser@npm:7.29.0":
version: 7.29.0
resolution: "@sentry/browser@npm:7.29.0"
dependencies:
"@sentry/core": 7.27.0
"@sentry/replay": 7.27.0
"@sentry/types": 7.27.0
"@sentry/utils": 7.27.0
"@sentry/core": 7.29.0
"@sentry/replay": 7.29.0
"@sentry/types": 7.29.0
"@sentry/utils": 7.29.0
tslib: ^1.9.3
checksum: da5e50bd576126cadf4d96aa9485d0108ad047bc94ac9aba982f51ab76f792be4c89dbcca5f9714332d99676d03f18d53a9f3918b380c1ca7e084f7d790b9f7f
checksum: 136b9d03a9ff38e72f4d8fd335f23469341d0095d1f075a36d85ef2cd6bd0763635a7e1cbc7abe14508291e88cffe549eda6016c858564b55c1d4e81ef67882f
languageName: node
linkType: hard
@@ -2196,42 +2196,42 @@ __metadata:
languageName: node
linkType: hard
"@sentry/core@npm:7.27.0":
version: 7.27.0
resolution: "@sentry/core@npm:7.27.0"
"@sentry/core@npm:7.29.0":
version: 7.29.0
resolution: "@sentry/core@npm:7.29.0"
dependencies:
"@sentry/types": 7.27.0
"@sentry/utils": 7.27.0
"@sentry/types": 7.29.0
"@sentry/utils": 7.29.0
tslib: ^1.9.3
checksum: 36138a8f43e3f959a1fe5ddc0f67a3b80248fd7b3fcd4465965b4a75a148d9afdf0f09393da4d61f5c978b24f4243952b9af8acd83bd79f5b669ef3d89ba96c6
checksum: d9330ed3528f2328b524cb237e400368dcb6c36b8afb791d28141e98ab5c0b56dc306a65cfc7164108cb5616346dabe793a39a140257f723906dc25a03b7ebcd
languageName: node
linkType: hard
"@sentry/integrations@npm:7.27.0":
version: 7.27.0
resolution: "@sentry/integrations@npm:7.27.0"
"@sentry/integrations@npm:7.29.0":
version: 7.29.0
resolution: "@sentry/integrations@npm:7.29.0"
dependencies:
"@sentry/types": 7.27.0
"@sentry/utils": 7.27.0
"@sentry/types": 7.29.0
"@sentry/utils": 7.29.0
localforage: ^1.8.1
tslib: ^1.9.3
checksum: 26cc2a10a4bb89ff131274efd448709e76b500a78594e7ebddcb2d9dfa533e3534373953f660603c6b21bb2a702d10f6602809f795e891d63aa783a2d3f2188c
checksum: fec2b9b7902b9b097b5453ae4c797e4efa18ac05a3b539c58d037085e12846f443ebe2e8d916a273ee4df71a29891265db5723b7fd4b5e8287fe5864cb9b2e43
languageName: node
linkType: hard
"@sentry/nextjs@npm:^7.27.0":
version: 7.27.0
resolution: "@sentry/nextjs@npm:7.27.0"
"@sentry/nextjs@npm:^7.29.0":
version: 7.29.0
resolution: "@sentry/nextjs@npm:7.29.0"
dependencies:
"@rollup/plugin-sucrase": 4.0.4
"@rollup/plugin-virtual": 3.0.0
"@sentry/core": 7.27.0
"@sentry/integrations": 7.27.0
"@sentry/node": 7.27.0
"@sentry/react": 7.27.0
"@sentry/tracing": 7.27.0
"@sentry/types": 7.27.0
"@sentry/utils": 7.27.0
"@sentry/core": 7.29.0
"@sentry/integrations": 7.29.0
"@sentry/node": 7.29.0
"@sentry/react": 7.29.0
"@sentry/tracing": 7.29.0
"@sentry/types": 7.29.0
"@sentry/utils": 7.29.0
"@sentry/webpack-plugin": 1.20.0
chalk: 3.0.0
rollup: 2.78.0
@@ -2243,79 +2243,79 @@ __metadata:
peerDependenciesMeta:
webpack:
optional: true
checksum: fdc0ba40b41280ce841e4d841ffe9dd57a6dac6446a47b5c634c9fe48c2a668c1ed6ba4533f37252ba37d034eb2971685b6b56a34f35df0b4edad56069701d56
checksum: 53864f15c199c810b3efa21bcae88a075619d7328b6c70d65660a9e5a01170404a867ddb20a8e7ef7a8fbcfd8d8d23a2bb5399f0d7e9bddb30af7aebd4a8ec99
languageName: node
linkType: hard
"@sentry/node@npm:7.27.0":
version: 7.27.0
resolution: "@sentry/node@npm:7.27.0"
"@sentry/node@npm:7.29.0":
version: 7.29.0
resolution: "@sentry/node@npm:7.29.0"
dependencies:
"@sentry/core": 7.27.0
"@sentry/types": 7.27.0
"@sentry/utils": 7.27.0
"@sentry/core": 7.29.0
"@sentry/types": 7.29.0
"@sentry/utils": 7.29.0
cookie: ^0.4.1
https-proxy-agent: ^5.0.0
lru_map: ^0.3.3
tslib: ^1.9.3
checksum: a42cb398ed1e8579229cff2fb1303c9809369046995da3c382e27e28d053360dd007828b94a1ff599f85eacc1e7c822b484fc2875995f7d6bb61ac8bcb464542
checksum: 1669d47dfaede34080a63f385bbac9908d4de68d055e1b8414554a77b9e89aee9839ce081a01e3301365d327f457c040b685536dba10f6e9eb71bf866fa9d065
languageName: node
linkType: hard
"@sentry/react@npm:7.27.0":
version: 7.27.0
resolution: "@sentry/react@npm:7.27.0"
"@sentry/react@npm:7.29.0":
version: 7.29.0
resolution: "@sentry/react@npm:7.29.0"
dependencies:
"@sentry/browser": 7.27.0
"@sentry/types": 7.27.0
"@sentry/utils": 7.27.0
"@sentry/browser": 7.29.0
"@sentry/types": 7.29.0
"@sentry/utils": 7.29.0
hoist-non-react-statics: ^3.3.2
tslib: ^1.9.3
peerDependencies:
react: 15.x || 16.x || 17.x || 18.x
checksum: 164cefe9efee1dc41bd7244c2da5567f3a772717bc537d40b961db1bb9e67458be13b79e0f68be4cbc2970daa868a5d786de682f40c8fbe0d0d42015bef32b81
checksum: 022bf398f2cf43bf5e1f7340cfc02ccfc4cdc026fb3d6805e760d182bcb2601d413cf412beaa37fecbbf0dc554ce38c4a01d9bf38d1591f80cd059ee5235205d
languageName: node
linkType: hard
"@sentry/replay@npm:7.27.0":
version: 7.27.0
resolution: "@sentry/replay@npm:7.27.0"
"@sentry/replay@npm:7.29.0":
version: 7.29.0
resolution: "@sentry/replay@npm:7.29.0"
dependencies:
"@sentry/core": 7.27.0
"@sentry/types": 7.27.0
"@sentry/utils": 7.27.0
"@sentry/core": 7.29.0
"@sentry/types": 7.29.0
"@sentry/utils": 7.29.0
peerDependencies:
"@sentry/browser": ">=7.24.0"
checksum: 440ac09c9acb2ced340c61ae56289dabdd006fd48a85545d8459990c93745b5e5cdbfcd0ec8311092a495094c2679239278650d2af373011df29d435333dbc66
checksum: 539e18c128bb7966c9d4ea91ebd9cde6d42f42f96fa648d7ead5bff699e643f3792f57a344376586fab26f659f5e1431176faf0e12e6ea53508fd48ba928dd12
languageName: node
linkType: hard
"@sentry/tracing@npm:7.27.0":
version: 7.27.0
resolution: "@sentry/tracing@npm:7.27.0"
"@sentry/tracing@npm:7.29.0":
version: 7.29.0
resolution: "@sentry/tracing@npm:7.29.0"
dependencies:
"@sentry/core": 7.27.0
"@sentry/types": 7.27.0
"@sentry/utils": 7.27.0
"@sentry/core": 7.29.0
"@sentry/types": 7.29.0
"@sentry/utils": 7.29.0
tslib: ^1.9.3
checksum: 203a3a6b467d6ccb12913f3da38e7d224f1d074dc3b3ac2e108a8ae6feff8d60ecb379eedf1b2bd82b1cdd58c11801df5b426e4a15be0a70845c9e2eae05b6ed
checksum: 7ad9040664a8c65693aba2bdd9cecc8334ce25a296c01727d38649c7141106b78c92142626ce8e44983b4272e0f411010a3df99843a1af6d4f89e4f67ce6f57e
languageName: node
linkType: hard
"@sentry/types@npm:7.27.0":
version: 7.27.0
resolution: "@sentry/types@npm:7.27.0"
checksum: a22056aa589da4b17f42548b1a218edbb839d97f865c9214d89dc4a831389ac71c647af087c6f363df28d7adadb0e623ad77a7f3243d411458aafc655714424e
"@sentry/types@npm:7.29.0":
version: 7.29.0
resolution: "@sentry/types@npm:7.29.0"
checksum: 53815b66662a193cfd7024b9fb2477afb8178a771aa59f3bef10578cc940a9d7207722f9f04e2ca65a8e118cef012ac42f4936aa921aacdfc00a914bec88b009
languageName: node
linkType: hard
"@sentry/utils@npm:7.27.0":
version: 7.27.0
resolution: "@sentry/utils@npm:7.27.0"
"@sentry/utils@npm:7.29.0":
version: 7.29.0
resolution: "@sentry/utils@npm:7.29.0"
dependencies:
"@sentry/types": 7.27.0
"@sentry/types": 7.29.0
tslib: ^1.9.3
checksum: d01f2d1999b877904df04e521a05a6978a756eeb518b6ca5099edf7888023691ed3b812eb089bd77c92069764b8928d285dd33cf667ab2030a8e590d79ca55da
checksum: 9914a2129692a5713453437d75b957a18ad5a4ef8085776e5499208ad329dea8da27ee2e2b74fdc089a3831b4e2929f8e6c0f3bc75528f41023d85de5077f462
languageName: node
linkType: hard
@@ -5255,7 +5255,7 @@ __metadata:
"@keplr-wallet/proto-types": ^0.11.25
"@keplr-wallet/types": ^0.11.25
"@next/eslint-plugin-next": ^13.0.5
"@sentry/nextjs": ^7.27.0
"@sentry/nextjs": ^7.29.0
"@svgr/webpack": ^6.5.1
"@types/cors": ^2
"@types/eslint": ^8.4.10