@n1xyz/wallet-widget 0.0.33-alpha.3 → 0.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animations/N1Loader.js +8 -14
- package/dist/animations/N1Loader.js.map +1 -1
- package/dist/animations/Processing.js +8 -14
- package/dist/animations/Processing.js.map +1 -1
- package/dist/components/LoadingFallback.js +2 -6
- package/dist/components/LoadingFallback.js.map +1 -1
- package/dist/components/Logo.js +22 -25
- package/dist/components/Logo.js.map +1 -1
- package/dist/components/N1ConnectButton.js +12 -18
- package/dist/components/N1ConnectButton.js.map +1 -1
- package/dist/components/logos/ArbitrumLogo.js +3 -7
- package/dist/components/logos/ArbitrumLogo.js.map +1 -1
- package/dist/components/logos/BaseLogo.js +3 -7
- package/dist/components/logos/BaseLogo.js.map +1 -1
- package/dist/components/logos/BeraLogo.js +3 -7
- package/dist/components/logos/BeraLogo.js.map +1 -1
- package/dist/components/logos/BitcoinLogo.js +3 -7
- package/dist/components/logos/BitcoinLogo.js.map +1 -1
- package/dist/components/logos/EthereumLogo.js +3 -7
- package/dist/components/logos/EthereumLogo.js.map +1 -1
- package/dist/components/logos/HyperliquidLogo.js +3 -7
- package/dist/components/logos/HyperliquidLogo.js.map +1 -1
- package/dist/components/logos/OptimismLogo.js +3 -7
- package/dist/components/logos/OptimismLogo.js.map +1 -1
- package/dist/components/logos/SolanaLogo.js +3 -7
- package/dist/components/logos/SolanaLogo.js.map +1 -1
- package/dist/components/logos/ZeroOneLogo.js +3 -7
- package/dist/components/logos/ZeroOneLogo.js.map +1 -1
- package/dist/components/logos/index.js +9 -25
- package/dist/components/logos/index.js.map +1 -1
- package/dist/config/solana.js +3 -7
- package/dist/config/solana.js.map +1 -1
- package/dist/config.js +2 -5
- package/dist/config.js.map +1 -1
- package/dist/context/n1-wallet-context.js +4 -8
- package/dist/context/n1-wallet-context.js.map +1 -1
- package/dist/errors/types.js +3 -6
- package/dist/errors/types.js.map +1 -1
- package/dist/features/onboarding-flow/N1WalletModal.js +23 -59
- package/dist/features/onboarding-flow/N1WalletModal.js.map +1 -1
- package/dist/features/onboarding-flow/OnboardingFlow.js +46 -50
- package/dist/features/onboarding-flow/OnboardingFlow.js.map +1 -1
- package/dist/features/onboarding-flow/components/ChainButton.js +4 -7
- package/dist/features/onboarding-flow/components/ChainButton.js.map +1 -1
- package/dist/features/onboarding-flow/components/Header.js +11 -15
- package/dist/features/onboarding-flow/components/Header.js.map +1 -1
- package/dist/features/onboarding-flow/components/ImageWithFallback.js +6 -10
- package/dist/features/onboarding-flow/components/ImageWithFallback.js.map +1 -1
- package/dist/features/onboarding-flow/components/TransactionTable.js +10 -13
- package/dist/features/onboarding-flow/components/TransactionTable.js.map +1 -1
- package/dist/features/onboarding-flow/components/WaitingMessage.js +8 -14
- package/dist/features/onboarding-flow/components/WaitingMessage.js.map +1 -1
- package/dist/features/onboarding-flow/components/index.js +5 -21
- package/dist/features/onboarding-flow/components/index.js.map +1 -1
- package/dist/features/onboarding-flow/index.js +1 -5
- package/dist/features/onboarding-flow/index.js.map +1 -1
- package/dist/features/onboarding-flow/providers/DepositFlowProvider.js +55 -60
- package/dist/features/onboarding-flow/providers/DepositFlowProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/OnboardingStateProvider.js +43 -48
- package/dist/features/onboarding-flow/providers/OnboardingStateProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/StateProvider.js +7 -11
- package/dist/features/onboarding-flow/providers/StateProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/WalletConnectionProvider.js +69 -74
- package/dist/features/onboarding-flow/providers/WalletConnectionProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/debug.js +18 -21
- package/dist/features/onboarding-flow/providers/debug.js.map +1 -1
- package/dist/features/onboarding-flow/providers/index.js +5 -16
- package/dist/features/onboarding-flow/providers/index.js.map +1 -1
- package/dist/features/onboarding-flow/providers/onboardingStateMachine.js +15 -20
- package/dist/features/onboarding-flow/providers/onboardingStateMachine.js.map +1 -1
- package/dist/features/onboarding-flow/screens/01-ConnectWalletScreen.js +8 -11
- package/dist/features/onboarding-flow/screens/01-ConnectWalletScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/02-ChainSelectionScreen.js +34 -38
- package/dist/features/onboarding-flow/screens/02-ChainSelectionScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/03-AmountInputScreen.js +47 -51
- package/dist/features/onboarding-flow/screens/03-AmountInputScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/04-DepositProgressScreen.js +8 -12
- package/dist/features/onboarding-flow/screens/04-DepositProgressScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/05-DepositSuccessScreen.js +25 -28
- package/dist/features/onboarding-flow/screens/05-DepositSuccessScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/06-AuthLoadingScreen.js +10 -13
- package/dist/features/onboarding-flow/screens/06-AuthLoadingScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/07-ErrorScreen.js +7 -10
- package/dist/features/onboarding-flow/screens/07-ErrorScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/index.js +7 -23
- package/dist/features/onboarding-flow/screens/index.js.map +1 -1
- package/dist/features/onboarding-flow/types.js +3 -6
- package/dist/features/onboarding-flow/types.js.map +1 -1
- package/dist/features/onboarding-flow/utils/depositStorage.js +3 -8
- package/dist/features/onboarding-flow/utils/depositStorage.js.map +1 -1
- package/dist/features/onboarding-flow/utils/imageUtils.js +3 -9
- package/dist/features/onboarding-flow/utils/imageUtils.js.map +1 -1
- package/dist/features/onboarding-flow/utils/nordUser.js +2 -38
- package/dist/features/onboarding-flow/utils/nordUser.js.map +1 -1
- package/dist/features/onboarding-flow/utils/nordUtils.js +5 -12
- package/dist/features/onboarding-flow/utils/nordUtils.js.map +1 -1
- package/dist/features/onboarding-flow/utils/session.js +14 -17
- package/dist/features/onboarding-flow/utils/session.js.map +1 -1
- package/dist/features/onboarding-flow/utils/transaction.js +1 -4
- package/dist/features/onboarding-flow/utils/transaction.js.map +1 -1
- package/dist/features/onboarding-flow/utils/utils.js +8 -16
- package/dist/features/onboarding-flow/utils/utils.js.map +1 -1
- package/dist/features/onboarding-flow/utils/withImageFallback.js +9 -15
- package/dist/features/onboarding-flow/utils/withImageFallback.js.map +1 -1
- package/dist/hooks/index.js +2 -18
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useN1Wallet.js +6 -10
- package/dist/hooks/useN1Wallet.js.map +1 -1
- package/dist/hooks/useNordUserInitialization.js +31 -34
- package/dist/hooks/useNordUserInitialization.js.map +1 -1
- package/dist/index.js +7 -21
- package/dist/index.js.map +1 -1
- package/dist/main.css +2 -0
- package/dist/polyfills/windowEthereumGuard.js +1 -2
- package/dist/polyfills/windowEthereumGuard.js.map +1 -1
- package/dist/providers/LazyWalletProvider.js +38 -74
- package/dist/providers/LazyWalletProvider.js.map +1 -1
- package/dist/providers/N1WalletProvider.js +70 -109
- package/dist/providers/N1WalletProvider.js.map +1 -1
- package/dist/providers/ShadowRootWrapper.js +4 -10
- package/dist/providers/ShadowRootWrapper.js.map +1 -1
- package/dist/providers/WalletErrorBoundary.js +6 -11
- package/dist/providers/WalletErrorBoundary.js.map +1 -1
- package/dist/styles/embedded-main-css.js +1 -3
- package/dist/styles/embedded-main-css.js.map +1 -1
- package/dist/styles/main.css +1 -1
- package/dist/types/wallet.js +4 -7
- package/dist/types/wallet.js.map +1 -1
- package/dist/utils/ed25519.js +14 -20
- package/dist/utils/ed25519.js.map +1 -1
- package/dist/utils/getPseudoName.js +7 -10
- package/dist/utils/getPseudoName.js.map +1 -1
- package/dist/utils/logger.js +3 -5
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/shortenString.js +2 -6
- package/dist/utils/shortenString.js.map +1 -1
- package/dist/utils/words.js +1 -4
- package/dist/utils/words.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WaitingMessage.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/components/WaitingMessage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"WaitingMessage.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/components/WaitingMessage.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,IAAI,MAAM,0BAA0B,CAAC;AAQ5C,MAAM,UAAU,cAAc,CAAC,EAIT;QAHpB,OAAO,aAAA,EACP,kBAAe,EAAf,UAAU,mBAAG,EAAE,KAAA,EACf,iBAAoB,EAApB,SAAS,mBAAG,QAAQ,KAAA;IAEpB,OAAO,CACL,eAAK,SAAS,EAAC,2CAA2C,aACvD,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CACxB,KAAC,iBAAiB,IAAC,IAAI,EAAE,UAAU,GAAI,CACxC,CAAC,CAAC,CAAC,CACF,KAAC,qBAAqB,KAAG,CAC1B,EACD,eAAK,SAAS,EAAC,4BAA4B,aACzC,aAAI,SAAS,EAAC,mGAAmG,YAC/G,cAAK,SAAS,EAAC,UAAU,YACtB,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,GAC7B,GACH,EACL,cAAK,SAAS,EAAC,mEAAmE,YAChF,cAAK,SAAS,EAAC,UAAU,YACtB,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,GAChC,GACF,IACF,IACF,CACP,CAAC;AACJ,CAAC;AAED,IAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,UAAC,CAAC,EAAE,KAAK,IAAK,OAAA,KAAK,EAAL,CAAK,CAAC,CAAC;AAEnE,IAAM,YAAY,GAAG,cAAM,OAAA,CACzB,cAAK,SAAS,EAAC,6BAA6B,YACzC,WAAW,CAAC,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,CAC1B,eAEE,SAAS,EAAC,6EAA6E,EACvF,KAAK,EAAE;YACL,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,OAAO;YACf,cAAc,EAAE,UAAG,KAAK,GAAG,IAAI,MAAG;YAClC,iBAAiB,EAAE,MAAM;SAC1B,iBACW,MAAM,IARb,mBAAY,KAAK,CAAE,CASxB,CACH,EAZ2B,CAY3B,CAAC,GACE,CACP,EAhB0B,CAgB1B,CAAC;AAEF,IAAM,qBAAqB,GAAG,cAAM,OAAA,CAClC,cACE,SAAS,EAAC,yCAAyC,gBACxC,sCAAsC,YAEjD,eAAK,SAAS,EAAC,yBAAyB,aACtC,cAAK,SAAS,EAAC,qIAAqI,YAClJ,cAAK,SAAS,EAAC,iFAAiF,YAC9F,KAAC,UAAU,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,GACjC,GACF,EACN,KAAC,YAAY,KAAG,EAChB,cAAK,SAAS,EAAC,8FAA8F,YAC3G,cAAK,SAAS,EAAC,0EAA0E,YACvF,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,oBAAoB,GAAG,GAC7C,GACF,EACN,KAAC,YAAY,KAAG,EAChB,cAAK,SAAS,EAAC,8FAA8F,YAC3G,cAAK,SAAS,EAAC,0EAA0E,YACvF,KAAC,WAAW,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,GAClC,GACF,IACF,GACF,CACP,EAzBmC,CAyBnC,CAAC","sourcesContent":["import { WaitingMessageState } from '../types';\nimport { N1LoaderAnimation } from '../../../animations/N1Loader';\nimport { SolanaLogo, ZeroOneLogo } from '../../../components/logos';\nimport Logo from '../../../components/Logo';\n\ninterface WaitingMessageProps {\n message: WaitingMessageState;\n loaderSize?: number;\n animation?: 'loader' | 'transfer';\n}\n\nexport function WaitingMessage({\n message,\n loaderSize = 48,\n animation = 'loader',\n}: WaitingMessageProps) {\n return (\n <div className=\"flex flex-col items-center justify-center\">\n {animation === 'loader' ? (\n <N1LoaderAnimation size={loaderSize} />\n ) : (\n <TransferWaveAnimation />\n )}\n <div className=\"text-center w-[300px] my-4\">\n <h3 className=\"text-sm text-white transition-all duration-300 h-[32px] flex items-center justify-center relative\"> \n <div className=\"absolute\">\n {message.visible && message.title}\n </div>\n </h3>\n <div className=\"text-xs flex items-center justify-center relative mt-2 font-light\">\n <div className=\"absolute\">\n {message.visible && message.subtitle}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nconst DOT_INDICES = Array.from({ length: 7 }, (_, index) => index);\n\nconst TransferDots = () => (\n <div className=\"flex items-center gap-[3px]\">\n {DOT_INDICES.map((index) => (\n <span\n key={`wave-dot-${index}`}\n className=\"n1-ww-animate-transfer-dot n1-ww-force-motion rounded-full bg-n1-ww-main/90\"\n style={{\n width: '2.5px',\n height: '2.5px',\n animationDelay: `${index * 0.12}s`,\n animationDuration: '1.6s',\n }}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n);\n\nconst TransferWaveAnimation = () => (\n <div\n className=\"flex w-full items-center justify-center\"\n aria-label=\"Solana deposit moving into N1 and 01\"\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"relative h-7 w-7 rounded-full bg-gradient-to-br from-black via-neutral-900 to-neutral-800 p-px shadow-[0_12px_30px_rgba(0,0,0,0.6)]\">\n <div className=\"flex h-full w-full items-center justify-center rounded-full bg-black text-white\">\n <SolanaLogo width={14} height={14} />\n </div>\n </div>\n <TransferDots />\n <div className=\"relative h-7 w-7 rounded-full bg-n1-ww-gray-800/70 p-px shadow-[0_12px_30px_rgba(0,0,0,0.6)]\">\n <div className=\"flex h-full w-full items-center justify-center rounded-full bg-[#1b1b1b]\">\n <Logo size={12} className=\"text-n1-ww-main/90\" />\n </div>\n </div>\n <TransferDots />\n <div className=\"relative h-7 w-7 rounded-full bg-n1-ww-gray-800/70 p-px shadow-[0_12px_30px_rgba(0,0,0,0.6)]\">\n <div className=\"flex h-full w-full items-center justify-center rounded-full bg-[#1b1b1b]\">\n <ZeroOneLogo width={14} height={11} />\n </div>\n </div>\n </div>\n </div>\n);\n"]}
|
|
@@ -1,22 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./ImageWithFallback"), exports);
|
|
18
|
-
__exportStar(require("./ChainButton"), exports);
|
|
19
|
-
__exportStar(require("./TransactionTable"), exports);
|
|
20
|
-
__exportStar(require("./WaitingMessage"), exports);
|
|
21
|
-
__exportStar(require("./Header"), exports);
|
|
1
|
+
export * from './ImageWithFallback';
|
|
2
|
+
export * from './ChainButton';
|
|
3
|
+
export * from './TransactionTable';
|
|
4
|
+
export * from './WaitingMessage';
|
|
5
|
+
export * from './Header';
|
|
22
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/components/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC","sourcesContent":["export * from './ImageWithFallback';\nexport * from './ChainButton';\nexport * from './TransactionTable';\nexport * from './WaitingMessage';\nexport * from './Header';\n"]}
|
|
@@ -1,6 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.OnboardingFlow = void 0;
|
|
4
|
-
var OnboardingFlow_1 = require("./OnboardingFlow");
|
|
5
|
-
Object.defineProperty(exports, "OnboardingFlow", { enumerable: true, get: function () { return OnboardingFlow_1.OnboardingFlow; } });
|
|
1
|
+
export { OnboardingFlow } from './OnboardingFlow';
|
|
6
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/onboarding-flow/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/onboarding-flow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC","sourcesContent":["export { OnboardingFlow } from './OnboardingFlow';\n"]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
2
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
3
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -35,59 +34,57 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
35
34
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
35
|
}
|
|
37
36
|
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
var OnboardingStateProvider_1 = require("./OnboardingStateProvider");
|
|
48
|
-
var depositStorage_1 = require("../utils/depositStorage");
|
|
37
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
38
|
+
import { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';
|
|
39
|
+
import { PublicKey } from '@solana/web3.js';
|
|
40
|
+
import { getExplorerUrl, } from '../utils/transaction';
|
|
41
|
+
import { useN1WalletContext } from '../../../hooks';
|
|
42
|
+
import { logger } from '../../../utils/logger';
|
|
43
|
+
import { OnboardingStep } from '../types';
|
|
44
|
+
import { useOnboardingState } from './OnboardingStateProvider';
|
|
45
|
+
import { clearLastDepositRecord, saveLastDepositRecord } from '../utils/depositStorage';
|
|
49
46
|
var DEPOSIT_POLL_INTERVAL_MS = 5000;
|
|
50
47
|
var SLOT_LOOKUP_TIMEOUT_MS = 2 * 60 * 1000;
|
|
51
48
|
var DEPOSIT_EVENT_TIMEOUT_MS = 5 * 60 * 1000;
|
|
52
49
|
var NORD_ACK_TIMEOUT_MS = 5 * 60 * 1000;
|
|
53
50
|
// Create the context with a default value
|
|
54
|
-
var DepositFlowContext =
|
|
51
|
+
var DepositFlowContext = createContext(undefined);
|
|
55
52
|
/**
|
|
56
53
|
* Provider component for the deposit flow state
|
|
57
54
|
*/
|
|
58
|
-
var DepositFlowProvider = function (_a) {
|
|
55
|
+
export var DepositFlowProvider = function (_a) {
|
|
59
56
|
var children = _a.children;
|
|
60
57
|
// Get flow state context
|
|
61
|
-
var _b =
|
|
58
|
+
var _b = useOnboardingState(), state = _b.state, context = _b.context, flowActions = _b.actions, updateContext = _b.updateContext, isDebugOverride = _b.isDebugOverride;
|
|
62
59
|
// Get wallet context
|
|
63
|
-
var _c =
|
|
60
|
+
var _c = useN1WalletContext(), address = _c.address, nord = _c.nord, nordUser = _c.nordUser;
|
|
64
61
|
// chain
|
|
65
|
-
var _d =
|
|
62
|
+
var _d = useState(context.selectedChain), selectedChain = _d[0], setSelectedChain = _d[1];
|
|
66
63
|
// transaction & deposit
|
|
67
|
-
var _e =
|
|
68
|
-
var _f =
|
|
69
|
-
var _g =
|
|
70
|
-
var _h =
|
|
71
|
-
var _j =
|
|
64
|
+
var _e = useState(context.amount), amount = _e[0], setAmount = _e[1];
|
|
65
|
+
var _f = useState(false), isDepositing = _f[0], setIsDepositing = _f[1];
|
|
66
|
+
var _g = useState('solana'), depositProgressPhase = _g[0], setDepositProgressPhase = _g[1];
|
|
67
|
+
var _h = useState(context.transactionId), transactionId = _h[0], setTransactionId = _h[1];
|
|
68
|
+
var _j = useState(null), transactionResult = _j[0], setTransactionResult = _j[1];
|
|
72
69
|
// auth
|
|
73
|
-
var _k =
|
|
74
|
-
var _l =
|
|
75
|
-
var _m =
|
|
70
|
+
var _k = useState('loading'), authStatus = _k[0], setAuthStatus = _k[1];
|
|
71
|
+
var _l = useState(null), authErrorMessage = _l[0], setAuthErrorMessage = _l[1];
|
|
72
|
+
var _m = useState(null), authStatusMessage = _m[0], setAuthStatusMessage = _m[1];
|
|
76
73
|
// Use refs to track previous values
|
|
77
|
-
var prevContextRef =
|
|
74
|
+
var prevContextRef = useRef(context);
|
|
78
75
|
/**
|
|
79
76
|
* Handle an error by transitioning to error state
|
|
80
77
|
*/
|
|
81
|
-
var handleError =
|
|
82
|
-
|
|
78
|
+
var handleError = useCallback(function (error) {
|
|
79
|
+
logger.error('Flow error:', error);
|
|
83
80
|
flowActions.setErrorState(error);
|
|
84
81
|
}, [flowActions]);
|
|
85
|
-
var authInFlightRef =
|
|
86
|
-
var waitingForNordUserRef =
|
|
82
|
+
var authInFlightRef = useRef(false);
|
|
83
|
+
var waitingForNordUserRef = useRef(false);
|
|
87
84
|
/**
|
|
88
85
|
* Authenticate session
|
|
89
86
|
*/
|
|
90
|
-
var performAuth =
|
|
87
|
+
var performAuth = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
91
88
|
var sessionPubKey, sessionId, sessionIdKey, error_1;
|
|
92
89
|
return __generator(this, function (_a) {
|
|
93
90
|
switch (_a.label) {
|
|
@@ -127,14 +124,14 @@ var DepositFlowProvider = function (_a) {
|
|
|
127
124
|
if (!sessionId) {
|
|
128
125
|
throw new Error('Failed to get session ID after refresh');
|
|
129
126
|
}
|
|
130
|
-
|
|
127
|
+
logger.debug('Session refreshed successfully', {
|
|
131
128
|
sessionId: sessionId.toString(),
|
|
132
129
|
});
|
|
133
130
|
// Step 3: Store sessionId in localStorage
|
|
134
131
|
if (address) {
|
|
135
132
|
sessionIdKey = "n1_sessionId_".concat(address);
|
|
136
133
|
localStorage.setItem(sessionIdKey, sessionId.toString());
|
|
137
|
-
|
|
134
|
+
logger.debug('Stored sessionId in localStorage', { key: sessionIdKey });
|
|
138
135
|
}
|
|
139
136
|
// Step 4: Update status to success
|
|
140
137
|
setAuthStatus('success');
|
|
@@ -165,7 +162,7 @@ var DepositFlowProvider = function (_a) {
|
|
|
165
162
|
setAuthStatusMessage,
|
|
166
163
|
setAuthErrorMessage,
|
|
167
164
|
]);
|
|
168
|
-
|
|
165
|
+
useEffect(function () {
|
|
169
166
|
if (waitingForNordUserRef.current && nordUser) {
|
|
170
167
|
performAuth();
|
|
171
168
|
}
|
|
@@ -173,14 +170,14 @@ var DepositFlowProvider = function (_a) {
|
|
|
173
170
|
/**
|
|
174
171
|
* Update amount for deposit
|
|
175
172
|
*/
|
|
176
|
-
var updateAmount =
|
|
173
|
+
var updateAmount = useCallback(function (newAmount) {
|
|
177
174
|
setAmount(newAmount);
|
|
178
175
|
updateContext({ amount: newAmount });
|
|
179
176
|
}, [updateContext]);
|
|
180
177
|
/**
|
|
181
178
|
* Start deposit process
|
|
182
179
|
*/
|
|
183
|
-
var startDeposit =
|
|
180
|
+
var startDeposit = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
184
181
|
var protonClient, solanaConnection, recipientKey, usdcToken, normalizedAmount, txId, depositResponse, slot, eventIndex, result, depositRecord, depositError_1, errorMessage;
|
|
185
182
|
var _a, _b, _c;
|
|
186
183
|
return __generator(this, function (_d) {
|
|
@@ -188,7 +185,7 @@ var DepositFlowProvider = function (_a) {
|
|
|
188
185
|
case 0:
|
|
189
186
|
if (isDepositing)
|
|
190
187
|
return [2 /*return*/];
|
|
191
|
-
|
|
188
|
+
logger.debug('Starting deposit process');
|
|
192
189
|
if (!amount || parseFloat(amount) <= 0) {
|
|
193
190
|
handleError(new Error('Invalid amount'));
|
|
194
191
|
return [2 /*return*/];
|
|
@@ -211,7 +208,7 @@ var DepositFlowProvider = function (_a) {
|
|
|
211
208
|
handleError(new Error('Nord client is missing Solana or Proton configuration. Verify your Nord deployment.'));
|
|
212
209
|
return [2 /*return*/];
|
|
213
210
|
}
|
|
214
|
-
recipientKey = new
|
|
211
|
+
recipientKey = new PublicKey(address);
|
|
215
212
|
usdcToken = Array.isArray(nord.tokens)
|
|
216
213
|
? nord.tokens.find(function (t) { return t.symbol === 'USDC'; })
|
|
217
214
|
: null;
|
|
@@ -255,20 +252,20 @@ var DepositFlowProvider = function (_a) {
|
|
|
255
252
|
if (!txId) {
|
|
256
253
|
throw new Error('Failed to submit deposit transaction.');
|
|
257
254
|
}
|
|
258
|
-
|
|
255
|
+
logger.debug('Deposit transaction submitted', { txId: txId });
|
|
259
256
|
return [4 /*yield*/, waitForTransactionSlot(solanaConnection, txId)];
|
|
260
257
|
case 6:
|
|
261
258
|
slot = _d.sent();
|
|
262
|
-
|
|
259
|
+
logger.debug('Solana slot detected for deposit', { slot: slot });
|
|
263
260
|
return [4 /*yield*/, waitForDepositEventIndex(protonClient, recipientKey, slot)];
|
|
264
261
|
case 7:
|
|
265
262
|
eventIndex = _d.sent();
|
|
266
|
-
|
|
263
|
+
logger.debug('Deposit event indexed', { eventIndex: eventIndex });
|
|
267
264
|
setDepositProgressPhase('nord');
|
|
268
265
|
return [4 /*yield*/, waitForNordAcknowledgement(nord, eventIndex)];
|
|
269
266
|
case 8:
|
|
270
267
|
_d.sent();
|
|
271
|
-
|
|
268
|
+
logger.debug('Nord acknowledged deposit event', { eventIndex: eventIndex });
|
|
272
269
|
result = {
|
|
273
270
|
success: true,
|
|
274
271
|
transactionId: txId,
|
|
@@ -278,7 +275,7 @@ var DepositFlowProvider = function (_a) {
|
|
|
278
275
|
toAddress: 'Exchange Account',
|
|
279
276
|
networkName: selectedChain,
|
|
280
277
|
status: 'Completed',
|
|
281
|
-
explorerUrl:
|
|
278
|
+
explorerUrl: getExplorerUrl(txId),
|
|
282
279
|
};
|
|
283
280
|
depositRecord = {
|
|
284
281
|
transactionId: txId,
|
|
@@ -289,11 +286,11 @@ var DepositFlowProvider = function (_a) {
|
|
|
289
286
|
chainNetwork: (_c = context.selectedChainNetwork) !== null && _c !== void 0 ? _c : null,
|
|
290
287
|
timestamp: Date.now(),
|
|
291
288
|
};
|
|
292
|
-
|
|
289
|
+
saveLastDepositRecord(address, depositRecord);
|
|
293
290
|
// Update state with transaction result
|
|
294
291
|
setTransactionId(txId);
|
|
295
292
|
setTransactionResult(result);
|
|
296
|
-
|
|
293
|
+
logger.debug('Transaction completed successfully');
|
|
297
294
|
flowActions.markDepositSuccess({
|
|
298
295
|
transactionId: txId,
|
|
299
296
|
record: depositRecord,
|
|
@@ -301,7 +298,7 @@ var DepositFlowProvider = function (_a) {
|
|
|
301
298
|
return [3 /*break*/, 11];
|
|
302
299
|
case 9:
|
|
303
300
|
depositError_1 = _d.sent();
|
|
304
|
-
|
|
301
|
+
logger.error('Deposit process failed', depositError_1);
|
|
305
302
|
errorMessage = depositError_1 instanceof Error
|
|
306
303
|
? depositError_1.message
|
|
307
304
|
: 'Failed to process deposit';
|
|
@@ -329,8 +326,8 @@ var DepositFlowProvider = function (_a) {
|
|
|
329
326
|
/**
|
|
330
327
|
* Complete the deposit process and move to the next screen
|
|
331
328
|
*/
|
|
332
|
-
var completeDeposit =
|
|
333
|
-
|
|
329
|
+
var completeDeposit = useCallback(function () {
|
|
330
|
+
clearLastDepositRecord(address);
|
|
334
331
|
updateContext({ lastDeposit: null });
|
|
335
332
|
if (context.isDepositOnlyFlow) {
|
|
336
333
|
flowActions.completeFlow({
|
|
@@ -370,7 +367,7 @@ var DepositFlowProvider = function (_a) {
|
|
|
370
367
|
/**
|
|
371
368
|
* Update state based on context changes
|
|
372
369
|
*/
|
|
373
|
-
|
|
370
|
+
useEffect(function () {
|
|
374
371
|
var prevContext = prevContextRef.current;
|
|
375
372
|
// Only update state if the relevant context values have actually changed
|
|
376
373
|
if (context.selectedChain !== prevContext.selectedChain) {
|
|
@@ -385,9 +382,9 @@ var DepositFlowProvider = function (_a) {
|
|
|
385
382
|
// Update the ref to the current context
|
|
386
383
|
prevContextRef.current = context;
|
|
387
384
|
}, [context]);
|
|
388
|
-
|
|
385
|
+
useEffect(function () {
|
|
389
386
|
var _a, _b;
|
|
390
|
-
if (!isDebugOverride || state !==
|
|
387
|
+
if (!isDebugOverride || state !== OnboardingStep.DEPOSIT_SUCCESS || transactionResult) {
|
|
391
388
|
return;
|
|
392
389
|
}
|
|
393
390
|
var mockTransactionId = (_a = context.transactionId) !== null && _a !== void 0 ? _a : 'debug-tx-12345';
|
|
@@ -402,12 +399,11 @@ var DepositFlowProvider = function (_a) {
|
|
|
402
399
|
toAddress: 'Nord Account',
|
|
403
400
|
networkName: fallbackChain,
|
|
404
401
|
status: 'Completed',
|
|
405
|
-
explorerUrl:
|
|
402
|
+
explorerUrl: getExplorerUrl(mockTransactionId),
|
|
406
403
|
});
|
|
407
404
|
}, [isDebugOverride, state, transactionResult, context, address]);
|
|
408
|
-
return ((
|
|
405
|
+
return (_jsx(DepositFlowContext.Provider, { value: contextValue, children: children }));
|
|
409
406
|
};
|
|
410
|
-
exports.DepositFlowProvider = DepositFlowProvider;
|
|
411
407
|
var delay = function (ms) {
|
|
412
408
|
return new Promise(function (resolve) {
|
|
413
409
|
setTimeout(resolve, ms);
|
|
@@ -419,7 +415,7 @@ var waitForTransactionSlot = function (connection, signature) { return __awaiter
|
|
|
419
415
|
return __generator(this, function (_b) {
|
|
420
416
|
switch (_b.label) {
|
|
421
417
|
case 0:
|
|
422
|
-
|
|
418
|
+
logger.debug('Waiting for Solana confirmation for deposit', { signature: signature });
|
|
423
419
|
deadline = Date.now() + SLOT_LOOKUP_TIMEOUT_MS;
|
|
424
420
|
_b.label = 1;
|
|
425
421
|
case 1:
|
|
@@ -449,7 +445,7 @@ var waitForDepositEventIndex = function (protonClient, recipient, slot) { return
|
|
|
449
445
|
return __generator(this, function (_a) {
|
|
450
446
|
switch (_a.label) {
|
|
451
447
|
case 0:
|
|
452
|
-
|
|
448
|
+
logger.debug('Polling Proton for deposit entry', { slot: slot });
|
|
453
449
|
deadline = Date.now() + DEPOSIT_EVENT_TIMEOUT_MS;
|
|
454
450
|
_a.label = 1;
|
|
455
451
|
case 1:
|
|
@@ -490,7 +486,7 @@ var waitForNordAcknowledgement = function (nord, targetEventIndex) { return __aw
|
|
|
490
486
|
return __generator(this, function (_a) {
|
|
491
487
|
switch (_a.label) {
|
|
492
488
|
case 0:
|
|
493
|
-
|
|
489
|
+
logger.debug('Polling Nord for deposit acknowledgement', {
|
|
494
490
|
targetEventIndex: targetEventIndex,
|
|
495
491
|
});
|
|
496
492
|
deadline = Date.now() + NORD_ACK_TIMEOUT_MS;
|
|
@@ -519,12 +515,11 @@ var waitForNordAcknowledgement = function (nord, targetEventIndex) { return __aw
|
|
|
519
515
|
/**
|
|
520
516
|
* Hook to use the deposit flow context
|
|
521
517
|
*/
|
|
522
|
-
var useDepositFlow = function () {
|
|
523
|
-
var context =
|
|
518
|
+
export var useDepositFlow = function () {
|
|
519
|
+
var context = useContext(DepositFlowContext);
|
|
524
520
|
if (context === undefined) {
|
|
525
521
|
throw new Error('useDepositFlow must be used within a DepositFlowProvider');
|
|
526
522
|
}
|
|
527
523
|
return context;
|
|
528
524
|
};
|
|
529
|
-
exports.useDepositFlow = useDepositFlow;
|
|
530
525
|
//# sourceMappingURL=DepositFlowProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DepositFlowProvider.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/providers/DepositFlowProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport { Connection, PublicKey } from '@solana/web3.js';\nimport {\n getExplorerUrl,\n TransactionResult,\n} from '../utils/transaction';\nimport { useN1WalletContext } from '../../../hooks';\nimport { logger } from '../../../utils/logger';\nimport { OnboardingStep } from '../types';\nimport { useOnboardingState } from './OnboardingStateProvider';\nimport { clearLastDepositRecord, saveLastDepositRecord } from '../utils/depositStorage';\n\nconst DEPOSIT_POLL_INTERVAL_MS = 5_000;\nconst SLOT_LOOKUP_TIMEOUT_MS = 2 * 60 * 1_000;\nconst DEPOSIT_EVENT_TIMEOUT_MS = 5 * 60 * 1_000;\nconst NORD_ACK_TIMEOUT_MS = 5 * 60 * 1_000;\n\ntype DepositProgressPhase = 'solana' | 'nord';\n\ninterface ProtonDepositRecord {\n eventIndex?: number | string | null;\n createdAtSlot: number;\n amount: number;\n depositorTokenAccount: string;\n bufferAccount: string;\n recipient: string;\n mint: string;\n}\n\ninterface ProtonClientLike {\n depositsForRecipient: (\n recipient: PublicKey,\n options: {\n startSlot?: number;\n order: 'desc' | 'asc';\n }\n ) => Promise<ProtonDepositRecord[]>;\n}\n\n// Define the shape of the deposit state value\nexport interface DepositFlowContextValue {\n amount: string;\n isDepositing: boolean;\n depositProgressPhase: DepositProgressPhase;\n transactionId: string | null;\n transactionResult: TransactionResult | null;\n authStatus: 'loading' | 'success' | 'error';\n authErrorMessage: string | null;\n authStatusMessage: string | null;\n updateAmount: (newAmount: string) => void;\n startDeposit: () => Promise<void>;\n completeDeposit: () => void;\n performAuth: () => Promise<void>;\n}\n\n// Create the context with a default value\nconst DepositFlowContext = createContext<DepositFlowContextValue | undefined>(undefined);\n\n// Props for the provider component\ninterface DepositFlowProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Provider component for the deposit flow state\n */\nexport const DepositFlowProvider: React.FC<DepositFlowProviderProps> = ({\n children,\n}) => {\n // Get flow state context\n const {\n state,\n context,\n actions: flowActions,\n updateContext,\n isDebugOverride,\n } = useOnboardingState();\n\n // Get wallet context\n const {\n address,\n nord,\n nordUser,\n } = useN1WalletContext();\n\n // chain\n const [selectedChain, setSelectedChain] = useState<string | null>(\n context.selectedChain\n );\n\n // transaction & deposit\n const [amount, setAmount] = useState(context.amount);\n const [isDepositing, setIsDepositing] = useState(false);\n const [depositProgressPhase, setDepositProgressPhase] =\n useState<DepositProgressPhase>('solana');\n const [transactionId, setTransactionId] = useState<string | null>(context.transactionId);\n const [transactionResult, setTransactionResult] = useState<TransactionResult | null>(null);\n\n\n // auth\n const [authStatus, setAuthStatus] = useState<'loading' | 'success' | 'error'>('loading');\n const [authErrorMessage, setAuthErrorMessage] = useState<string | null>(null);\n const [authStatusMessage, setAuthStatusMessage] = useState<string | null>(null);\n\n // Use refs to track previous values\n const prevContextRef = useRef(context);\n\n\n /**\n * Handle an error by transitioning to error state\n */\n const handleError = useCallback(\n (error: Error) => {\n logger.error('Flow error:', error);\n flowActions.setErrorState(error);\n },\n [flowActions]\n );\n\n const authInFlightRef = useRef(false);\n const waitingForNordUserRef = useRef(false);\n\n /**\n * Authenticate session\n */\n const performAuth = useCallback(async () => {\n if (authInFlightRef.current) {\n return;\n }\n\n authInFlightRef.current = true;\n try {\n // Step 1: Tell user to sign transaction\n setAuthStatusMessage(\n 'Please sign the transaction to authenticate your session'\n );\n\n if (!nordUser) {\n waitingForNordUserRef.current = true;\n setAuthStatus('loading');\n setAuthStatusMessage('Preparing your Nord session…');\n return;\n }\n\n waitingForNordUserRef.current = false;\n\n // Step 2: Call nordUser.refreshSession and get sessionId\n setAuthStatusMessage('Session is being authenticated...');\n\n // Get the session public key from the nordUser\n const sessionPubKey = nordUser.sessionPubKey;\n if (!sessionPubKey) {\n throw new Error('Session public key is not available');\n }\n\n // Refresh the session\n await nordUser.refreshSession();\n await nordUser.updateAccountId();\n\n console.log('nordUser', nordUser);\n\n // Get the sessionId after refresh\n const sessionId = nordUser.sessionId;\n if (!sessionId) {\n throw new Error('Failed to get session ID after refresh');\n }\n\n logger.debug('Session refreshed successfully', {\n sessionId: sessionId.toString(),\n });\n\n // Step 3: Store sessionId in localStorage\n if (address) {\n const sessionIdKey = `n1_sessionId_${address}`;\n localStorage.setItem(sessionIdKey, sessionId.toString());\n logger.debug('Stored sessionId in localStorage', { key: sessionIdKey });\n }\n\n // Step 4: Update status to success\n setAuthStatus('success');\n\n // updateContext({ hasActiveSession: true });\n flowActions.completeFlow({\n hasActiveSession: true,\n hasNordAccount: true,\n });\n\n } catch (error) {\n console.error('Authentication error:', error);\n setAuthStatus('error');\n setAuthErrorMessage(\n error instanceof Error ? error.message : 'Unknown error occurred'\n );\n } finally {\n authInFlightRef.current = false;\n }\n }, [\n updateContext,\n flowActions,\n address,\n nordUser,\n setAuthStatus,\n setAuthStatusMessage,\n setAuthErrorMessage,\n ]);\n\n useEffect(() => {\n if (waitingForNordUserRef.current && nordUser) {\n performAuth();\n }\n }, [nordUser, performAuth]);\n\n /**\n * Update amount for deposit\n */\n const updateAmount = useCallback(\n (newAmount: string) => {\n setAmount(newAmount);\n updateContext({ amount: newAmount });\n },\n [updateContext]\n );\n\n /**\n * Start deposit process\n */\n const startDeposit = useCallback(async () => {\n if (isDepositing) return;\n\n logger.debug('Starting deposit process');\n\n if (!amount || parseFloat(amount) <= 0) {\n handleError(new Error('Invalid amount'));\n return;\n }\n\n if (!nord) {\n handleError(\n new Error(\n 'Nord client is unavailable. Please check your configuration and try again.'\n )\n );\n return;\n }\n\n if (!nordUser) {\n handleError(\n new Error(\n 'Your Nord session is not ready yet. Reconnect your wallet to retry.'\n )\n );\n return;\n }\n\n if (!address) {\n handleError(\n new Error(\n 'We were unable to determine your wallet address. Please reconnect your wallet and try again.'\n )\n );\n return;\n }\n\n const protonClient = nord.protonClient as ProtonClientLike | undefined;\n const solanaConnection = nord.solanaConnection as Connection | undefined;\n\n if (!protonClient || !solanaConnection) {\n handleError(\n new Error(\n 'Nord client is missing Solana or Proton configuration. Verify your Nord deployment.'\n )\n );\n return;\n }\n\n const recipientKey = new PublicKey(address);\n\n const usdcToken = Array.isArray(nord.tokens)\n ? nord.tokens.find((t: any) => t.symbol === 'USDC')\n : null;\n\n if (!usdcToken) {\n handleError(\n new Error(\n 'Nord token configuration is missing USDC. Verify your Nord deployment.'\n )\n );\n return;\n }\n\n setIsDepositing(true);\n setDepositProgressPhase('solana');\n flowActions.startDeposit();\n\n try {\n const normalizedAmount = parseFloat(amount);\n let txId: string | null = null;\n\n if (typeof nordUser.deposit === 'function') {\n const depositResponse = await nordUser.deposit({\n amount: normalizedAmount,\n tokenId: usdcToken.tokenId,\n });\n\n if (depositResponse) {\n if (typeof depositResponse === 'string') {\n txId = depositResponse;\n } else if (\n typeof depositResponse === 'object' &&\n 'signature' in depositResponse &&\n typeof depositResponse.signature === 'string'\n ) {\n txId = depositResponse.signature;\n }\n }\n }\n\n if (!txId) {\n txId = await nordUser.depositSpl(normalizedAmount, usdcToken.tokenId);\n }\n\n if (!txId) {\n throw new Error('Failed to submit deposit transaction.');\n }\n\n logger.debug('Deposit transaction submitted', { txId });\n\n const slot = await waitForTransactionSlot(solanaConnection, txId);\n logger.debug('Solana slot detected for deposit', { slot });\n\n const eventIndex = await waitForDepositEventIndex(\n protonClient,\n recipientKey,\n slot\n );\n\n logger.debug('Deposit event indexed', { eventIndex });\n setDepositProgressPhase('nord');\n\n await waitForNordAcknowledgement(nord, eventIndex);\n logger.debug('Nord acknowledged deposit event', { eventIndex });\n\n // Create transaction result object immediately after successful deposit\n const result: TransactionResult = {\n success: true,\n transactionId: txId,\n amount,\n tokenSymbol: 'USDC',\n fromAddress: address || 'Your Wallet',\n toAddress: 'Exchange Account',\n networkName: selectedChain!,\n status: 'Completed',\n explorerUrl: getExplorerUrl(txId),\n };\n\n const depositRecord = {\n transactionId: txId,\n amount,\n tokenSymbol: 'USDC',\n chainId: context.selectedChainId ?? (selectedChain ?? 'solana'),\n chainName: context.selectedChain ?? (selectedChain ?? 'Solana'),\n chainNetwork: context.selectedChainNetwork ?? null,\n timestamp: Date.now(),\n };\n\n saveLastDepositRecord(address, depositRecord);\n\n // Update state with transaction result\n setTransactionId(txId);\n setTransactionResult(result);\n logger.debug('Transaction completed successfully');\n flowActions.markDepositSuccess({\n transactionId: txId,\n record: depositRecord,\n });\n } catch (depositError) {\n logger.error('Deposit process failed', depositError);\n const errorMessage = depositError instanceof Error\n ? depositError.message\n : 'Failed to process deposit';\n\n flowActions.markDepositFailed(errorMessage);\n return; // Exit early\n } finally {\n setIsDepositing(false);\n }\n }, [\n isDepositing,\n selectedChain,\n amount,\n address,\n flowActions,\n handleError,\n nord,\n nordUser,\n context.selectedChain,\n context.selectedChainId,\n context.selectedChainNetwork,\n ]);\n\n /**\n * Complete the deposit process and move to the next screen\n */\n const completeDeposit = useCallback(() => {\n clearLastDepositRecord(address);\n updateContext({ lastDeposit: null });\n\n if (context.isDepositOnlyFlow) {\n flowActions.completeFlow({\n hasNordAccount: true,\n hasActiveSession: true,\n });\n return;\n }\n\n // Check if user has an active session to determine the next state\n if (context.hasActiveSession) {\n // If user has an active session, go directly to FINAL_SUCCESS\n flowActions.completeFlow({\n hasNordAccount: true,\n hasActiveSession: true,\n });\n } else {\n // If user doesn't have an active session, go to authentication flow\n flowActions.requireAuth({ hasNordAccount: true });\n }\n }, [context.hasActiveSession, context.isDepositOnlyFlow, flowActions, address, updateContext]);\n\n\n\n\n\n // Create the context value\n const contextValue: DepositFlowContextValue = {\n amount,\n isDepositing,\n depositProgressPhase,\n transactionId,\n transactionResult,\n authStatus,\n authErrorMessage,\n authStatusMessage,\n updateAmount,\n startDeposit,\n completeDeposit,\n performAuth,\n };\n\n\n /**\n * Update state based on context changes\n */\n useEffect(() => {\n const prevContext = prevContextRef.current;\n\n // Only update state if the relevant context values have actually changed\n if (context.selectedChain !== prevContext.selectedChain) {\n setSelectedChain(context.selectedChain);\n }\n\n if (context.amount !== prevContext.amount) {\n setAmount(context.amount);\n }\n\n if (context.transactionId !== prevContext.transactionId) {\n setTransactionId(context.transactionId);\n }\n\n // Update the ref to the current context\n prevContextRef.current = context;\n }, [context]);\n\n useEffect(() => {\n if (!isDebugOverride || state !== OnboardingStep.DEPOSIT_SUCCESS || transactionResult) {\n return;\n }\n\n const mockTransactionId = context.transactionId ?? 'debug-tx-12345';\n const fallbackChain = context.selectedChain ?? 'Solana';\n setTransactionId(mockTransactionId);\n setTransactionResult({\n success: true,\n transactionId: mockTransactionId,\n amount: context.amount || '1,250',\n tokenSymbol: 'USDC',\n fromAddress: address || 'Debug Wallet',\n toAddress: 'Nord Account',\n networkName: fallbackChain,\n status: 'Completed',\n explorerUrl: getExplorerUrl(mockTransactionId),\n });\n }, [isDebugOverride, state, transactionResult, context, address]);\n\n\n\n return (\n <DepositFlowContext.Provider value={contextValue}>\n {children}\n </DepositFlowContext.Provider>\n );\n};\n\nconst delay = (ms: number) =>\n new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n\nconst waitForTransactionSlot = async (\n connection: Connection,\n signature: string\n): Promise<number> => {\n logger.debug('Waiting for Solana confirmation for deposit', { signature });\n const deadline = Date.now() + SLOT_LOOKUP_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n const status = await connection.getSignatureStatuses([signature], {\n searchTransactionHistory: true,\n });\n const info = status.value?.[0];\n\n if (info?.err) {\n throw new Error('Deposit transaction failed to confirm on Solana.');\n }\n\n if (info && typeof info.slot === 'number') {\n return info.slot;\n }\n\n await delay(2_000);\n }\n\n throw new Error('Timed out waiting for Solana confirmation of the deposit.');\n};\n\nconst waitForDepositEventIndex = async (\n protonClient: ProtonClientLike,\n recipient: PublicKey,\n slot: number\n): Promise<number> => {\n logger.debug('Polling Proton for deposit entry', { slot });\n const deadline = Date.now() + DEPOSIT_EVENT_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n const deposits = await protonClient.depositsForRecipient(recipient, {\n startSlot: slot,\n order: 'desc',\n });\n\n if (Array.isArray(deposits)) {\n const matchingDeposit = deposits.find((deposit) => {\n const depositSlot =\n typeof deposit.createdAtSlot === 'string'\n ? Number(deposit.createdAtSlot)\n : deposit.createdAtSlot;\n return Number.isFinite(depositSlot) && depositSlot === slot;\n });\n\n if (matchingDeposit) {\n const rawEventIndex =\n matchingDeposit.eventIndex === undefined ||\n matchingDeposit.eventIndex === null\n ? null\n : Number(matchingDeposit.eventIndex);\n\n if (Number.isFinite(rawEventIndex)) {\n return rawEventIndex as number;\n }\n }\n }\n\n await delay(DEPOSIT_POLL_INTERVAL_MS);\n }\n\n throw new Error('Timed out waiting for Nord to index the deposit event.');\n};\n\nconst waitForNordAcknowledgement = async (\n nord: { getActionNonce: () => Promise<number | string | bigint> },\n targetEventIndex: number\n): Promise<void> => {\n logger.debug('Polling Nord for deposit acknowledgement', {\n targetEventIndex,\n });\n const deadline = Date.now() + NORD_ACK_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n const nonce = await nord.getActionNonce();\n const normalized =\n typeof nonce === 'bigint'\n ? Number(nonce)\n : typeof nonce === 'string'\n ? Number(nonce)\n : nonce;\n\n if (Number.isFinite(normalized) && normalized >= targetEventIndex) {\n return;\n }\n\n await delay(DEPOSIT_POLL_INTERVAL_MS);\n }\n\n throw new Error('Timed out waiting for N1 to process the deposit.');\n};\n\n/**\n * Hook to use the deposit flow context\n */\nexport const useDepositFlow = (): DepositFlowContextValue => {\n const context = useContext(DepositFlowContext);\n if (context === undefined) {\n throw new Error('useDepositFlow must be used within a DepositFlowProvider');\n }\n return context;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"DepositFlowProvider.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/providers/DepositFlowProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport { Connection, PublicKey } from '@solana/web3.js';\nimport {\n getExplorerUrl,\n TransactionResult,\n} from '../utils/transaction';\nimport { useN1WalletContext } from '../../../hooks';\nimport { logger } from '../../../utils/logger';\nimport { OnboardingStep } from '../types';\nimport { useOnboardingState } from './OnboardingStateProvider';\nimport { clearLastDepositRecord, saveLastDepositRecord } from '../utils/depositStorage';\n\nconst DEPOSIT_POLL_INTERVAL_MS = 5_000;\nconst SLOT_LOOKUP_TIMEOUT_MS = 2 * 60 * 1_000;\nconst DEPOSIT_EVENT_TIMEOUT_MS = 5 * 60 * 1_000;\nconst NORD_ACK_TIMEOUT_MS = 5 * 60 * 1_000;\n\ntype DepositProgressPhase = 'solana' | 'nord';\n\ninterface ProtonDepositRecord {\n eventIndex?: number | string | null;\n createdAtSlot: number;\n amount: number;\n depositorTokenAccount: string;\n bufferAccount: string;\n recipient: string;\n mint: string;\n}\n\ninterface ProtonClientLike {\n depositsForRecipient: (\n recipient: PublicKey,\n options: {\n startSlot?: number;\n order: 'desc' | 'asc';\n }\n ) => Promise<ProtonDepositRecord[]>;\n}\n\n// Define the shape of the deposit state value\nexport interface DepositFlowContextValue {\n amount: string;\n isDepositing: boolean;\n depositProgressPhase: DepositProgressPhase;\n transactionId: string | null;\n transactionResult: TransactionResult | null;\n authStatus: 'loading' | 'success' | 'error';\n authErrorMessage: string | null;\n authStatusMessage: string | null;\n updateAmount: (newAmount: string) => void;\n startDeposit: () => Promise<void>;\n completeDeposit: () => void;\n performAuth: () => Promise<void>;\n}\n\n// Create the context with a default value\nconst DepositFlowContext = createContext<DepositFlowContextValue | undefined>(undefined);\n\n// Props for the provider component\ninterface DepositFlowProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Provider component for the deposit flow state\n */\nexport const DepositFlowProvider: React.FC<DepositFlowProviderProps> = ({\n children,\n}) => {\n // Get flow state context\n const {\n state,\n context,\n actions: flowActions,\n updateContext,\n isDebugOverride,\n } = useOnboardingState();\n\n // Get wallet context\n const {\n address,\n nord,\n nordUser,\n } = useN1WalletContext();\n\n // chain\n const [selectedChain, setSelectedChain] = useState<string | null>(\n context.selectedChain\n );\n\n // transaction & deposit\n const [amount, setAmount] = useState(context.amount);\n const [isDepositing, setIsDepositing] = useState(false);\n const [depositProgressPhase, setDepositProgressPhase] =\n useState<DepositProgressPhase>('solana');\n const [transactionId, setTransactionId] = useState<string | null>(context.transactionId);\n const [transactionResult, setTransactionResult] = useState<TransactionResult | null>(null);\n\n\n // auth\n const [authStatus, setAuthStatus] = useState<'loading' | 'success' | 'error'>('loading');\n const [authErrorMessage, setAuthErrorMessage] = useState<string | null>(null);\n const [authStatusMessage, setAuthStatusMessage] = useState<string | null>(null);\n\n // Use refs to track previous values\n const prevContextRef = useRef(context);\n\n\n /**\n * Handle an error by transitioning to error state\n */\n const handleError = useCallback(\n (error: Error) => {\n logger.error('Flow error:', error);\n flowActions.setErrorState(error);\n },\n [flowActions]\n );\n\n const authInFlightRef = useRef(false);\n const waitingForNordUserRef = useRef(false);\n\n /**\n * Authenticate session\n */\n const performAuth = useCallback(async () => {\n if (authInFlightRef.current) {\n return;\n }\n\n authInFlightRef.current = true;\n try {\n // Step 1: Tell user to sign transaction\n setAuthStatusMessage(\n 'Please sign the transaction to authenticate your session'\n );\n\n if (!nordUser) {\n waitingForNordUserRef.current = true;\n setAuthStatus('loading');\n setAuthStatusMessage('Preparing your Nord session…');\n return;\n }\n\n waitingForNordUserRef.current = false;\n\n // Step 2: Call nordUser.refreshSession and get sessionId\n setAuthStatusMessage('Session is being authenticated...');\n\n // Get the session public key from the nordUser\n const sessionPubKey = nordUser.sessionPubKey;\n if (!sessionPubKey) {\n throw new Error('Session public key is not available');\n }\n\n // Refresh the session\n await nordUser.refreshSession();\n await nordUser.updateAccountId();\n\n console.log('nordUser', nordUser);\n\n // Get the sessionId after refresh\n const sessionId = nordUser.sessionId;\n if (!sessionId) {\n throw new Error('Failed to get session ID after refresh');\n }\n\n logger.debug('Session refreshed successfully', {\n sessionId: sessionId.toString(),\n });\n\n // Step 3: Store sessionId in localStorage\n if (address) {\n const sessionIdKey = `n1_sessionId_${address}`;\n localStorage.setItem(sessionIdKey, sessionId.toString());\n logger.debug('Stored sessionId in localStorage', { key: sessionIdKey });\n }\n\n // Step 4: Update status to success\n setAuthStatus('success');\n\n // updateContext({ hasActiveSession: true });\n flowActions.completeFlow({\n hasActiveSession: true,\n hasNordAccount: true,\n });\n\n } catch (error) {\n console.error('Authentication error:', error);\n setAuthStatus('error');\n setAuthErrorMessage(\n error instanceof Error ? error.message : 'Unknown error occurred'\n );\n } finally {\n authInFlightRef.current = false;\n }\n }, [\n updateContext,\n flowActions,\n address,\n nordUser,\n setAuthStatus,\n setAuthStatusMessage,\n setAuthErrorMessage,\n ]);\n\n useEffect(() => {\n if (waitingForNordUserRef.current && nordUser) {\n performAuth();\n }\n }, [nordUser, performAuth]);\n\n /**\n * Update amount for deposit\n */\n const updateAmount = useCallback(\n (newAmount: string) => {\n setAmount(newAmount);\n updateContext({ amount: newAmount });\n },\n [updateContext]\n );\n\n /**\n * Start deposit process\n */\n const startDeposit = useCallback(async () => {\n if (isDepositing) return;\n\n logger.debug('Starting deposit process');\n\n if (!amount || parseFloat(amount) <= 0) {\n handleError(new Error('Invalid amount'));\n return;\n }\n\n if (!nord) {\n handleError(\n new Error(\n 'Nord client is unavailable. Please check your configuration and try again.'\n )\n );\n return;\n }\n\n if (!nordUser) {\n handleError(\n new Error(\n 'Your Nord session is not ready yet. Reconnect your wallet to retry.'\n )\n );\n return;\n }\n\n if (!address) {\n handleError(\n new Error(\n 'We were unable to determine your wallet address. Please reconnect your wallet and try again.'\n )\n );\n return;\n }\n\n const protonClient = nord.protonClient as ProtonClientLike | undefined;\n const solanaConnection = nord.solanaConnection as Connection | undefined;\n\n if (!protonClient || !solanaConnection) {\n handleError(\n new Error(\n 'Nord client is missing Solana or Proton configuration. Verify your Nord deployment.'\n )\n );\n return;\n }\n\n const recipientKey = new PublicKey(address);\n\n const usdcToken = Array.isArray(nord.tokens)\n ? nord.tokens.find((t: any) => t.symbol === 'USDC')\n : null;\n\n if (!usdcToken) {\n handleError(\n new Error(\n 'Nord token configuration is missing USDC. Verify your Nord deployment.'\n )\n );\n return;\n }\n\n setIsDepositing(true);\n setDepositProgressPhase('solana');\n flowActions.startDeposit();\n\n try {\n const normalizedAmount = parseFloat(amount);\n let txId: string | null = null;\n\n if (typeof nordUser.deposit === 'function') {\n const depositResponse = await nordUser.deposit({\n amount: normalizedAmount,\n tokenId: usdcToken.tokenId,\n });\n\n if (depositResponse) {\n if (typeof depositResponse === 'string') {\n txId = depositResponse;\n } else if (\n typeof depositResponse === 'object' &&\n 'signature' in depositResponse &&\n typeof depositResponse.signature === 'string'\n ) {\n txId = depositResponse.signature;\n }\n }\n }\n\n if (!txId) {\n txId = await nordUser.depositSpl(normalizedAmount, usdcToken.tokenId);\n }\n\n if (!txId) {\n throw new Error('Failed to submit deposit transaction.');\n }\n\n logger.debug('Deposit transaction submitted', { txId });\n\n const slot = await waitForTransactionSlot(solanaConnection, txId);\n logger.debug('Solana slot detected for deposit', { slot });\n\n const eventIndex = await waitForDepositEventIndex(\n protonClient,\n recipientKey,\n slot\n );\n\n logger.debug('Deposit event indexed', { eventIndex });\n setDepositProgressPhase('nord');\n\n await waitForNordAcknowledgement(nord, eventIndex);\n logger.debug('Nord acknowledged deposit event', { eventIndex });\n\n // Create transaction result object immediately after successful deposit\n const result: TransactionResult = {\n success: true,\n transactionId: txId,\n amount,\n tokenSymbol: 'USDC',\n fromAddress: address || 'Your Wallet',\n toAddress: 'Exchange Account',\n networkName: selectedChain!,\n status: 'Completed',\n explorerUrl: getExplorerUrl(txId),\n };\n\n const depositRecord = {\n transactionId: txId,\n amount,\n tokenSymbol: 'USDC',\n chainId: context.selectedChainId ?? (selectedChain ?? 'solana'),\n chainName: context.selectedChain ?? (selectedChain ?? 'Solana'),\n chainNetwork: context.selectedChainNetwork ?? null,\n timestamp: Date.now(),\n };\n\n saveLastDepositRecord(address, depositRecord);\n\n // Update state with transaction result\n setTransactionId(txId);\n setTransactionResult(result);\n logger.debug('Transaction completed successfully');\n flowActions.markDepositSuccess({\n transactionId: txId,\n record: depositRecord,\n });\n } catch (depositError) {\n logger.error('Deposit process failed', depositError);\n const errorMessage = depositError instanceof Error\n ? depositError.message\n : 'Failed to process deposit';\n\n flowActions.markDepositFailed(errorMessage);\n return; // Exit early\n } finally {\n setIsDepositing(false);\n }\n }, [\n isDepositing,\n selectedChain,\n amount,\n address,\n flowActions,\n handleError,\n nord,\n nordUser,\n context.selectedChain,\n context.selectedChainId,\n context.selectedChainNetwork,\n ]);\n\n /**\n * Complete the deposit process and move to the next screen\n */\n const completeDeposit = useCallback(() => {\n clearLastDepositRecord(address);\n updateContext({ lastDeposit: null });\n\n if (context.isDepositOnlyFlow) {\n flowActions.completeFlow({\n hasNordAccount: true,\n hasActiveSession: true,\n });\n return;\n }\n\n // Check if user has an active session to determine the next state\n if (context.hasActiveSession) {\n // If user has an active session, go directly to FINAL_SUCCESS\n flowActions.completeFlow({\n hasNordAccount: true,\n hasActiveSession: true,\n });\n } else {\n // If user doesn't have an active session, go to authentication flow\n flowActions.requireAuth({ hasNordAccount: true });\n }\n }, [context.hasActiveSession, context.isDepositOnlyFlow, flowActions, address, updateContext]);\n\n\n\n\n\n // Create the context value\n const contextValue: DepositFlowContextValue = {\n amount,\n isDepositing,\n depositProgressPhase,\n transactionId,\n transactionResult,\n authStatus,\n authErrorMessage,\n authStatusMessage,\n updateAmount,\n startDeposit,\n completeDeposit,\n performAuth,\n };\n\n\n /**\n * Update state based on context changes\n */\n useEffect(() => {\n const prevContext = prevContextRef.current;\n\n // Only update state if the relevant context values have actually changed\n if (context.selectedChain !== prevContext.selectedChain) {\n setSelectedChain(context.selectedChain);\n }\n\n if (context.amount !== prevContext.amount) {\n setAmount(context.amount);\n }\n\n if (context.transactionId !== prevContext.transactionId) {\n setTransactionId(context.transactionId);\n }\n\n // Update the ref to the current context\n prevContextRef.current = context;\n }, [context]);\n\n useEffect(() => {\n if (!isDebugOverride || state !== OnboardingStep.DEPOSIT_SUCCESS || transactionResult) {\n return;\n }\n\n const mockTransactionId = context.transactionId ?? 'debug-tx-12345';\n const fallbackChain = context.selectedChain ?? 'Solana';\n setTransactionId(mockTransactionId);\n setTransactionResult({\n success: true,\n transactionId: mockTransactionId,\n amount: context.amount || '1,250',\n tokenSymbol: 'USDC',\n fromAddress: address || 'Debug Wallet',\n toAddress: 'Nord Account',\n networkName: fallbackChain,\n status: 'Completed',\n explorerUrl: getExplorerUrl(mockTransactionId),\n });\n }, [isDebugOverride, state, transactionResult, context, address]);\n\n\n\n return (\n <DepositFlowContext.Provider value={contextValue}>\n {children}\n </DepositFlowContext.Provider>\n );\n};\n\nconst delay = (ms: number) =>\n new Promise<void>((resolve) => {\n setTimeout(resolve, ms);\n });\n\nconst waitForTransactionSlot = async (\n connection: Connection,\n signature: string\n): Promise<number> => {\n logger.debug('Waiting for Solana confirmation for deposit', { signature });\n const deadline = Date.now() + SLOT_LOOKUP_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n const status = await connection.getSignatureStatuses([signature], {\n searchTransactionHistory: true,\n });\n const info = status.value?.[0];\n\n if (info?.err) {\n throw new Error('Deposit transaction failed to confirm on Solana.');\n }\n\n if (info && typeof info.slot === 'number') {\n return info.slot;\n }\n\n await delay(2_000);\n }\n\n throw new Error('Timed out waiting for Solana confirmation of the deposit.');\n};\n\nconst waitForDepositEventIndex = async (\n protonClient: ProtonClientLike,\n recipient: PublicKey,\n slot: number\n): Promise<number> => {\n logger.debug('Polling Proton for deposit entry', { slot });\n const deadline = Date.now() + DEPOSIT_EVENT_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n const deposits = await protonClient.depositsForRecipient(recipient, {\n startSlot: slot,\n order: 'desc',\n });\n\n if (Array.isArray(deposits)) {\n const matchingDeposit = deposits.find((deposit) => {\n const depositSlot =\n typeof deposit.createdAtSlot === 'string'\n ? Number(deposit.createdAtSlot)\n : deposit.createdAtSlot;\n return Number.isFinite(depositSlot) && depositSlot === slot;\n });\n\n if (matchingDeposit) {\n const rawEventIndex =\n matchingDeposit.eventIndex === undefined ||\n matchingDeposit.eventIndex === null\n ? null\n : Number(matchingDeposit.eventIndex);\n\n if (Number.isFinite(rawEventIndex)) {\n return rawEventIndex as number;\n }\n }\n }\n\n await delay(DEPOSIT_POLL_INTERVAL_MS);\n }\n\n throw new Error('Timed out waiting for Nord to index the deposit event.');\n};\n\nconst waitForNordAcknowledgement = async (\n nord: { getActionNonce: () => Promise<number | string | bigint> },\n targetEventIndex: number\n): Promise<void> => {\n logger.debug('Polling Nord for deposit acknowledgement', {\n targetEventIndex,\n });\n const deadline = Date.now() + NORD_ACK_TIMEOUT_MS;\n\n while (Date.now() < deadline) {\n const nonce = await nord.getActionNonce();\n const normalized =\n typeof nonce === 'bigint'\n ? Number(nonce)\n : typeof nonce === 'string'\n ? Number(nonce)\n : nonce;\n\n if (Number.isFinite(normalized) && normalized >= targetEventIndex) {\n return;\n }\n\n await delay(DEPOSIT_POLL_INTERVAL_MS);\n }\n\n throw new Error('Timed out waiting for N1 to process the deposit.');\n};\n\n/**\n * Hook to use the deposit flow context\n */\nexport const useDepositFlow = (): DepositFlowContextValue => {\n const context = useContext(DepositFlowContext);\n if (context === undefined) {\n throw new Error('useDepositFlow must be used within a DepositFlowProvider');\n }\n return context;\n};\n"]}
|