@n1xyz/wallet-widget 0.0.33-alpha.1 → 0.0.33-alpha.3
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 +14 -8
- package/dist/animations/N1Loader.js.map +1 -1
- package/dist/animations/Processing.js +14 -8
- package/dist/animations/Processing.js.map +1 -1
- package/dist/components/LoadingFallback.js +6 -2
- package/dist/components/LoadingFallback.js.map +1 -1
- package/dist/components/Logo.js +25 -22
- package/dist/components/Logo.js.map +1 -1
- package/dist/components/N1ConnectButton.js +18 -12
- package/dist/components/N1ConnectButton.js.map +1 -1
- package/dist/components/logos/ArbitrumLogo.js +7 -3
- package/dist/components/logos/ArbitrumLogo.js.map +1 -1
- package/dist/components/logos/BaseLogo.js +7 -3
- package/dist/components/logos/BaseLogo.js.map +1 -1
- package/dist/components/logos/BeraLogo.js +7 -3
- package/dist/components/logos/BeraLogo.js.map +1 -1
- package/dist/components/logos/BitcoinLogo.js +7 -3
- package/dist/components/logos/BitcoinLogo.js.map +1 -1
- package/dist/components/logos/EthereumLogo.js +7 -3
- package/dist/components/logos/EthereumLogo.js.map +1 -1
- package/dist/components/logos/HyperliquidLogo.js +7 -3
- package/dist/components/logos/HyperliquidLogo.js.map +1 -1
- package/dist/components/logos/OptimismLogo.js +7 -3
- package/dist/components/logos/OptimismLogo.js.map +1 -1
- package/dist/components/logos/SolanaLogo.js +7 -3
- package/dist/components/logos/SolanaLogo.js.map +1 -1
- package/dist/components/logos/ZeroOneLogo.js +7 -3
- package/dist/components/logos/ZeroOneLogo.js.map +1 -1
- package/dist/components/logos/index.js +25 -9
- package/dist/components/logos/index.js.map +1 -1
- package/dist/config/solana.js +7 -3
- package/dist/config/solana.js.map +1 -1
- package/dist/config.js +5 -2
- package/dist/config.js.map +1 -1
- package/dist/context/n1-wallet-context.js +8 -4
- package/dist/context/n1-wallet-context.js.map +1 -1
- package/dist/errors/types.js +6 -3
- package/dist/errors/types.js.map +1 -1
- package/dist/features/onboarding-flow/N1WalletModal.js +59 -23
- package/dist/features/onboarding-flow/N1WalletModal.js.map +1 -1
- package/dist/features/onboarding-flow/OnboardingFlow.js +50 -46
- package/dist/features/onboarding-flow/OnboardingFlow.js.map +1 -1
- package/dist/features/onboarding-flow/components/ChainButton.js +7 -4
- package/dist/features/onboarding-flow/components/ChainButton.js.map +1 -1
- package/dist/features/onboarding-flow/components/Header.js +15 -11
- package/dist/features/onboarding-flow/components/Header.js.map +1 -1
- package/dist/features/onboarding-flow/components/ImageWithFallback.js +10 -6
- package/dist/features/onboarding-flow/components/ImageWithFallback.js.map +1 -1
- package/dist/features/onboarding-flow/components/TransactionTable.js +13 -10
- package/dist/features/onboarding-flow/components/TransactionTable.js.map +1 -1
- package/dist/features/onboarding-flow/components/WaitingMessage.js +14 -8
- package/dist/features/onboarding-flow/components/WaitingMessage.js.map +1 -1
- package/dist/features/onboarding-flow/components/index.js +21 -5
- package/dist/features/onboarding-flow/components/index.js.map +1 -1
- package/dist/features/onboarding-flow/index.js +5 -1
- package/dist/features/onboarding-flow/index.js.map +1 -1
- package/dist/features/onboarding-flow/providers/DepositFlowProvider.js +60 -55
- package/dist/features/onboarding-flow/providers/DepositFlowProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/OnboardingStateProvider.js +48 -43
- package/dist/features/onboarding-flow/providers/OnboardingStateProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/StateProvider.js +11 -7
- package/dist/features/onboarding-flow/providers/StateProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/WalletConnectionProvider.js +74 -69
- package/dist/features/onboarding-flow/providers/WalletConnectionProvider.js.map +1 -1
- package/dist/features/onboarding-flow/providers/debug.js +21 -18
- package/dist/features/onboarding-flow/providers/debug.js.map +1 -1
- package/dist/features/onboarding-flow/providers/index.js +16 -5
- package/dist/features/onboarding-flow/providers/index.js.map +1 -1
- package/dist/features/onboarding-flow/providers/onboardingStateMachine.js +20 -15
- package/dist/features/onboarding-flow/providers/onboardingStateMachine.js.map +1 -1
- package/dist/features/onboarding-flow/screens/01-ConnectWalletScreen.js +11 -8
- package/dist/features/onboarding-flow/screens/01-ConnectWalletScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/02-ChainSelectionScreen.js +38 -34
- package/dist/features/onboarding-flow/screens/02-ChainSelectionScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/03-AmountInputScreen.js +51 -47
- package/dist/features/onboarding-flow/screens/03-AmountInputScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/04-DepositProgressScreen.js +12 -8
- package/dist/features/onboarding-flow/screens/04-DepositProgressScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/05-DepositSuccessScreen.js +28 -25
- package/dist/features/onboarding-flow/screens/05-DepositSuccessScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/06-AuthLoadingScreen.js +13 -10
- package/dist/features/onboarding-flow/screens/06-AuthLoadingScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/07-ErrorScreen.js +10 -7
- package/dist/features/onboarding-flow/screens/07-ErrorScreen.js.map +1 -1
- package/dist/features/onboarding-flow/screens/index.js +23 -7
- package/dist/features/onboarding-flow/screens/index.js.map +1 -1
- package/dist/features/onboarding-flow/types.js +6 -3
- package/dist/features/onboarding-flow/types.js.map +1 -1
- package/dist/features/onboarding-flow/utils/depositStorage.js +8 -3
- package/dist/features/onboarding-flow/utils/depositStorage.js.map +1 -1
- package/dist/features/onboarding-flow/utils/imageUtils.js +9 -3
- package/dist/features/onboarding-flow/utils/imageUtils.js.map +1 -1
- package/dist/features/onboarding-flow/utils/nordUser.js +38 -2
- package/dist/features/onboarding-flow/utils/nordUser.js.map +1 -1
- package/dist/features/onboarding-flow/utils/nordUtils.js +12 -5
- package/dist/features/onboarding-flow/utils/nordUtils.js.map +1 -1
- package/dist/features/onboarding-flow/utils/session.js +17 -14
- package/dist/features/onboarding-flow/utils/session.js.map +1 -1
- package/dist/features/onboarding-flow/utils/transaction.js +4 -1
- package/dist/features/onboarding-flow/utils/transaction.js.map +1 -1
- package/dist/features/onboarding-flow/utils/utils.js +16 -8
- package/dist/features/onboarding-flow/utils/utils.js.map +1 -1
- package/dist/features/onboarding-flow/utils/withImageFallback.js +15 -9
- package/dist/features/onboarding-flow/utils/withImageFallback.js.map +1 -1
- package/dist/hooks/index.js +18 -2
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useN1Wallet.js +10 -6
- package/dist/hooks/useN1Wallet.js.map +1 -1
- package/dist/hooks/useNordUserInitialization.js +34 -31
- package/dist/hooks/useNordUserInitialization.js.map +1 -1
- package/dist/index.js +21 -7
- package/dist/index.js.map +1 -1
- package/dist/polyfills/windowEthereumGuard.js +2 -1
- package/dist/polyfills/windowEthereumGuard.js.map +1 -1
- package/dist/providers/LazyWalletProvider.js +74 -38
- package/dist/providers/LazyWalletProvider.js.map +1 -1
- package/dist/providers/N1WalletProvider.js +109 -70
- package/dist/providers/N1WalletProvider.js.map +1 -1
- package/dist/providers/ShadowRootWrapper.js +10 -4
- package/dist/providers/ShadowRootWrapper.js.map +1 -1
- package/dist/providers/WalletErrorBoundary.js +11 -6
- package/dist/providers/WalletErrorBoundary.js.map +1 -1
- package/dist/styles/embedded-main-css.js +3 -1
- package/dist/styles/embedded-main-css.js.map +1 -1
- package/dist/types/wallet.js +7 -4
- package/dist/types/wallet.js.map +1 -1
- package/dist/utils/ed25519.js +20 -14
- package/dist/utils/ed25519.js.map +1 -1
- package/dist/utils/getPseudoName.js +10 -7
- package/dist/utils/getPseudoName.js.map +1 -1
- package/dist/utils/logger.js +5 -3
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/shortenString.js +6 -2
- package/dist/utils/shortenString.js.map +1 -1
- package/dist/utils/words.js +4 -1
- package/dist/utils/words.js.map +1 -1
- package/package.json +1 -2
|
@@ -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":";;;;;AAWA,wCA0BC;;AApCD,yDAAiE;AACjE,mDAAoE;AACpE,kEAA4C;AAQ5C,SAAgB,cAAc,CAAC,EAIT;QAHpB,OAAO,aAAA,EACP,kBAAe,EAAf,UAAU,mBAAG,EAAE,KAAA,EACf,iBAAoB,EAApB,SAAS,mBAAG,QAAQ,KAAA;IAEpB,OAAO,CACL,iCAAK,SAAS,EAAC,2CAA2C,aACvD,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CACxB,uBAAC,4BAAiB,IAAC,IAAI,EAAE,UAAU,GAAI,CACxC,CAAC,CAAC,CAAC,CACF,uBAAC,qBAAqB,KAAG,CAC1B,EACD,iCAAK,SAAS,EAAC,4BAA4B,aACzC,+BAAI,SAAS,EAAC,mGAAmG,YAC/G,gCAAK,SAAS,EAAC,UAAU,YACtB,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,GAC7B,GACH,EACL,gCAAK,SAAS,EAAC,mEAAmE,YAChF,gCAAK,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,gCAAK,SAAS,EAAC,6BAA6B,YACzC,WAAW,CAAC,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,CAC1B,iCAEE,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,gCACE,SAAS,EAAC,yCAAyC,gBACxC,sCAAsC,YAEjD,iCAAK,SAAS,EAAC,yBAAyB,aACtC,gCAAK,SAAS,EAAC,qIAAqI,YAClJ,gCAAK,SAAS,EAAC,iFAAiF,YAC9F,uBAAC,kBAAU,IAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAI,GACjC,GACF,EACN,uBAAC,YAAY,KAAG,EAChB,gCAAK,SAAS,EAAC,8FAA8F,YAC3G,gCAAK,SAAS,EAAC,0EAA0E,YACvF,uBAAC,cAAI,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,oBAAoB,GAAG,GAC7C,GACF,EACN,uBAAC,YAAY,KAAG,EAChB,gCAAK,SAAS,EAAC,8FAA8F,YAC3G,gCAAK,SAAS,EAAC,0EAA0E,YACvF,uBAAC,mBAAW,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,6 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
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);
|
|
6
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/components/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/features/onboarding-flow/components/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,gDAA8B;AAC9B,qDAAmC;AACnC,mDAAiC;AACjC,2CAAyB","sourcesContent":["export * from './ImageWithFallback';\nexport * from './ChainButton';\nexport * from './TransactionTable';\nexport * from './WaitingMessage';\nexport * from './Header';\n"]}
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
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; } });
|
|
2
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/onboarding-flow/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/onboarding-flow/index.ts"],"names":[],"mappings":";;;AAAA,mDAAkD;AAAzC,gHAAA,cAAc,OAAA","sourcesContent":["export { OnboardingFlow } from './OnboardingFlow';\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -34,57 +35,59 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
34
35
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
36
|
}
|
|
36
37
|
};
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.useDepositFlow = exports.DepositFlowProvider = void 0;
|
|
40
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
41
|
+
var react_1 = require("react");
|
|
42
|
+
var web3_js_1 = require("@solana/web3.js");
|
|
43
|
+
var transaction_1 = require("../utils/transaction");
|
|
44
|
+
var hooks_1 = require("../../../hooks");
|
|
45
|
+
var logger_1 = require("../../../utils/logger");
|
|
46
|
+
var types_1 = require("../types");
|
|
47
|
+
var OnboardingStateProvider_1 = require("./OnboardingStateProvider");
|
|
48
|
+
var depositStorage_1 = require("../utils/depositStorage");
|
|
46
49
|
var DEPOSIT_POLL_INTERVAL_MS = 5000;
|
|
47
50
|
var SLOT_LOOKUP_TIMEOUT_MS = 2 * 60 * 1000;
|
|
48
51
|
var DEPOSIT_EVENT_TIMEOUT_MS = 5 * 60 * 1000;
|
|
49
52
|
var NORD_ACK_TIMEOUT_MS = 5 * 60 * 1000;
|
|
50
53
|
// Create the context with a default value
|
|
51
|
-
var DepositFlowContext = createContext(undefined);
|
|
54
|
+
var DepositFlowContext = (0, react_1.createContext)(undefined);
|
|
52
55
|
/**
|
|
53
56
|
* Provider component for the deposit flow state
|
|
54
57
|
*/
|
|
55
|
-
|
|
58
|
+
var DepositFlowProvider = function (_a) {
|
|
56
59
|
var children = _a.children;
|
|
57
60
|
// Get flow state context
|
|
58
|
-
var _b = useOnboardingState(), state = _b.state, context = _b.context, flowActions = _b.actions, updateContext = _b.updateContext, isDebugOverride = _b.isDebugOverride;
|
|
61
|
+
var _b = (0, OnboardingStateProvider_1.useOnboardingState)(), state = _b.state, context = _b.context, flowActions = _b.actions, updateContext = _b.updateContext, isDebugOverride = _b.isDebugOverride;
|
|
59
62
|
// Get wallet context
|
|
60
|
-
var _c = useN1WalletContext(), address = _c.address, nord = _c.nord, nordUser = _c.nordUser;
|
|
63
|
+
var _c = (0, hooks_1.useN1WalletContext)(), address = _c.address, nord = _c.nord, nordUser = _c.nordUser;
|
|
61
64
|
// chain
|
|
62
|
-
var _d = useState(context.selectedChain), selectedChain = _d[0], setSelectedChain = _d[1];
|
|
65
|
+
var _d = (0, react_1.useState)(context.selectedChain), selectedChain = _d[0], setSelectedChain = _d[1];
|
|
63
66
|
// transaction & deposit
|
|
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];
|
|
67
|
+
var _e = (0, react_1.useState)(context.amount), amount = _e[0], setAmount = _e[1];
|
|
68
|
+
var _f = (0, react_1.useState)(false), isDepositing = _f[0], setIsDepositing = _f[1];
|
|
69
|
+
var _g = (0, react_1.useState)('solana'), depositProgressPhase = _g[0], setDepositProgressPhase = _g[1];
|
|
70
|
+
var _h = (0, react_1.useState)(context.transactionId), transactionId = _h[0], setTransactionId = _h[1];
|
|
71
|
+
var _j = (0, react_1.useState)(null), transactionResult = _j[0], setTransactionResult = _j[1];
|
|
69
72
|
// auth
|
|
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];
|
|
73
|
+
var _k = (0, react_1.useState)('loading'), authStatus = _k[0], setAuthStatus = _k[1];
|
|
74
|
+
var _l = (0, react_1.useState)(null), authErrorMessage = _l[0], setAuthErrorMessage = _l[1];
|
|
75
|
+
var _m = (0, react_1.useState)(null), authStatusMessage = _m[0], setAuthStatusMessage = _m[1];
|
|
73
76
|
// Use refs to track previous values
|
|
74
|
-
var prevContextRef = useRef(context);
|
|
77
|
+
var prevContextRef = (0, react_1.useRef)(context);
|
|
75
78
|
/**
|
|
76
79
|
* Handle an error by transitioning to error state
|
|
77
80
|
*/
|
|
78
|
-
var handleError = useCallback(function (error) {
|
|
79
|
-
logger.error('Flow error:', error);
|
|
81
|
+
var handleError = (0, react_1.useCallback)(function (error) {
|
|
82
|
+
logger_1.logger.error('Flow error:', error);
|
|
80
83
|
flowActions.setErrorState(error);
|
|
81
84
|
}, [flowActions]);
|
|
82
|
-
var authInFlightRef = useRef(false);
|
|
83
|
-
var waitingForNordUserRef = useRef(false);
|
|
85
|
+
var authInFlightRef = (0, react_1.useRef)(false);
|
|
86
|
+
var waitingForNordUserRef = (0, react_1.useRef)(false);
|
|
84
87
|
/**
|
|
85
88
|
* Authenticate session
|
|
86
89
|
*/
|
|
87
|
-
var performAuth = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
90
|
+
var performAuth = (0, react_1.useCallback)(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
88
91
|
var sessionPubKey, sessionId, sessionIdKey, error_1;
|
|
89
92
|
return __generator(this, function (_a) {
|
|
90
93
|
switch (_a.label) {
|
|
@@ -124,14 +127,14 @@ export var DepositFlowProvider = function (_a) {
|
|
|
124
127
|
if (!sessionId) {
|
|
125
128
|
throw new Error('Failed to get session ID after refresh');
|
|
126
129
|
}
|
|
127
|
-
logger.debug('Session refreshed successfully', {
|
|
130
|
+
logger_1.logger.debug('Session refreshed successfully', {
|
|
128
131
|
sessionId: sessionId.toString(),
|
|
129
132
|
});
|
|
130
133
|
// Step 3: Store sessionId in localStorage
|
|
131
134
|
if (address) {
|
|
132
135
|
sessionIdKey = "n1_sessionId_".concat(address);
|
|
133
136
|
localStorage.setItem(sessionIdKey, sessionId.toString());
|
|
134
|
-
logger.debug('Stored sessionId in localStorage', { key: sessionIdKey });
|
|
137
|
+
logger_1.logger.debug('Stored sessionId in localStorage', { key: sessionIdKey });
|
|
135
138
|
}
|
|
136
139
|
// Step 4: Update status to success
|
|
137
140
|
setAuthStatus('success');
|
|
@@ -162,7 +165,7 @@ export var DepositFlowProvider = function (_a) {
|
|
|
162
165
|
setAuthStatusMessage,
|
|
163
166
|
setAuthErrorMessage,
|
|
164
167
|
]);
|
|
165
|
-
useEffect(function () {
|
|
168
|
+
(0, react_1.useEffect)(function () {
|
|
166
169
|
if (waitingForNordUserRef.current && nordUser) {
|
|
167
170
|
performAuth();
|
|
168
171
|
}
|
|
@@ -170,14 +173,14 @@ export var DepositFlowProvider = function (_a) {
|
|
|
170
173
|
/**
|
|
171
174
|
* Update amount for deposit
|
|
172
175
|
*/
|
|
173
|
-
var updateAmount = useCallback(function (newAmount) {
|
|
176
|
+
var updateAmount = (0, react_1.useCallback)(function (newAmount) {
|
|
174
177
|
setAmount(newAmount);
|
|
175
178
|
updateContext({ amount: newAmount });
|
|
176
179
|
}, [updateContext]);
|
|
177
180
|
/**
|
|
178
181
|
* Start deposit process
|
|
179
182
|
*/
|
|
180
|
-
var startDeposit = useCallback(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
183
|
+
var startDeposit = (0, react_1.useCallback)(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
181
184
|
var protonClient, solanaConnection, recipientKey, usdcToken, normalizedAmount, txId, depositResponse, slot, eventIndex, result, depositRecord, depositError_1, errorMessage;
|
|
182
185
|
var _a, _b, _c;
|
|
183
186
|
return __generator(this, function (_d) {
|
|
@@ -185,7 +188,7 @@ export var DepositFlowProvider = function (_a) {
|
|
|
185
188
|
case 0:
|
|
186
189
|
if (isDepositing)
|
|
187
190
|
return [2 /*return*/];
|
|
188
|
-
logger.debug('Starting deposit process');
|
|
191
|
+
logger_1.logger.debug('Starting deposit process');
|
|
189
192
|
if (!amount || parseFloat(amount) <= 0) {
|
|
190
193
|
handleError(new Error('Invalid amount'));
|
|
191
194
|
return [2 /*return*/];
|
|
@@ -208,7 +211,7 @@ export var DepositFlowProvider = function (_a) {
|
|
|
208
211
|
handleError(new Error('Nord client is missing Solana or Proton configuration. Verify your Nord deployment.'));
|
|
209
212
|
return [2 /*return*/];
|
|
210
213
|
}
|
|
211
|
-
recipientKey = new PublicKey(address);
|
|
214
|
+
recipientKey = new web3_js_1.PublicKey(address);
|
|
212
215
|
usdcToken = Array.isArray(nord.tokens)
|
|
213
216
|
? nord.tokens.find(function (t) { return t.symbol === 'USDC'; })
|
|
214
217
|
: null;
|
|
@@ -252,20 +255,20 @@ export var DepositFlowProvider = function (_a) {
|
|
|
252
255
|
if (!txId) {
|
|
253
256
|
throw new Error('Failed to submit deposit transaction.');
|
|
254
257
|
}
|
|
255
|
-
logger.debug('Deposit transaction submitted', { txId: txId });
|
|
258
|
+
logger_1.logger.debug('Deposit transaction submitted', { txId: txId });
|
|
256
259
|
return [4 /*yield*/, waitForTransactionSlot(solanaConnection, txId)];
|
|
257
260
|
case 6:
|
|
258
261
|
slot = _d.sent();
|
|
259
|
-
logger.debug('Solana slot detected for deposit', { slot: slot });
|
|
262
|
+
logger_1.logger.debug('Solana slot detected for deposit', { slot: slot });
|
|
260
263
|
return [4 /*yield*/, waitForDepositEventIndex(protonClient, recipientKey, slot)];
|
|
261
264
|
case 7:
|
|
262
265
|
eventIndex = _d.sent();
|
|
263
|
-
logger.debug('Deposit event indexed', { eventIndex: eventIndex });
|
|
266
|
+
logger_1.logger.debug('Deposit event indexed', { eventIndex: eventIndex });
|
|
264
267
|
setDepositProgressPhase('nord');
|
|
265
268
|
return [4 /*yield*/, waitForNordAcknowledgement(nord, eventIndex)];
|
|
266
269
|
case 8:
|
|
267
270
|
_d.sent();
|
|
268
|
-
logger.debug('Nord acknowledged deposit event', { eventIndex: eventIndex });
|
|
271
|
+
logger_1.logger.debug('Nord acknowledged deposit event', { eventIndex: eventIndex });
|
|
269
272
|
result = {
|
|
270
273
|
success: true,
|
|
271
274
|
transactionId: txId,
|
|
@@ -275,7 +278,7 @@ export var DepositFlowProvider = function (_a) {
|
|
|
275
278
|
toAddress: 'Exchange Account',
|
|
276
279
|
networkName: selectedChain,
|
|
277
280
|
status: 'Completed',
|
|
278
|
-
explorerUrl: getExplorerUrl(txId),
|
|
281
|
+
explorerUrl: (0, transaction_1.getExplorerUrl)(txId),
|
|
279
282
|
};
|
|
280
283
|
depositRecord = {
|
|
281
284
|
transactionId: txId,
|
|
@@ -286,11 +289,11 @@ export var DepositFlowProvider = function (_a) {
|
|
|
286
289
|
chainNetwork: (_c = context.selectedChainNetwork) !== null && _c !== void 0 ? _c : null,
|
|
287
290
|
timestamp: Date.now(),
|
|
288
291
|
};
|
|
289
|
-
saveLastDepositRecord(address, depositRecord);
|
|
292
|
+
(0, depositStorage_1.saveLastDepositRecord)(address, depositRecord);
|
|
290
293
|
// Update state with transaction result
|
|
291
294
|
setTransactionId(txId);
|
|
292
295
|
setTransactionResult(result);
|
|
293
|
-
logger.debug('Transaction completed successfully');
|
|
296
|
+
logger_1.logger.debug('Transaction completed successfully');
|
|
294
297
|
flowActions.markDepositSuccess({
|
|
295
298
|
transactionId: txId,
|
|
296
299
|
record: depositRecord,
|
|
@@ -298,7 +301,7 @@ export var DepositFlowProvider = function (_a) {
|
|
|
298
301
|
return [3 /*break*/, 11];
|
|
299
302
|
case 9:
|
|
300
303
|
depositError_1 = _d.sent();
|
|
301
|
-
logger.error('Deposit process failed', depositError_1);
|
|
304
|
+
logger_1.logger.error('Deposit process failed', depositError_1);
|
|
302
305
|
errorMessage = depositError_1 instanceof Error
|
|
303
306
|
? depositError_1.message
|
|
304
307
|
: 'Failed to process deposit';
|
|
@@ -326,8 +329,8 @@ export var DepositFlowProvider = function (_a) {
|
|
|
326
329
|
/**
|
|
327
330
|
* Complete the deposit process and move to the next screen
|
|
328
331
|
*/
|
|
329
|
-
var completeDeposit = useCallback(function () {
|
|
330
|
-
clearLastDepositRecord(address);
|
|
332
|
+
var completeDeposit = (0, react_1.useCallback)(function () {
|
|
333
|
+
(0, depositStorage_1.clearLastDepositRecord)(address);
|
|
331
334
|
updateContext({ lastDeposit: null });
|
|
332
335
|
if (context.isDepositOnlyFlow) {
|
|
333
336
|
flowActions.completeFlow({
|
|
@@ -367,7 +370,7 @@ export var DepositFlowProvider = function (_a) {
|
|
|
367
370
|
/**
|
|
368
371
|
* Update state based on context changes
|
|
369
372
|
*/
|
|
370
|
-
useEffect(function () {
|
|
373
|
+
(0, react_1.useEffect)(function () {
|
|
371
374
|
var prevContext = prevContextRef.current;
|
|
372
375
|
// Only update state if the relevant context values have actually changed
|
|
373
376
|
if (context.selectedChain !== prevContext.selectedChain) {
|
|
@@ -382,9 +385,9 @@ export var DepositFlowProvider = function (_a) {
|
|
|
382
385
|
// Update the ref to the current context
|
|
383
386
|
prevContextRef.current = context;
|
|
384
387
|
}, [context]);
|
|
385
|
-
useEffect(function () {
|
|
388
|
+
(0, react_1.useEffect)(function () {
|
|
386
389
|
var _a, _b;
|
|
387
|
-
if (!isDebugOverride || state !== OnboardingStep.DEPOSIT_SUCCESS || transactionResult) {
|
|
390
|
+
if (!isDebugOverride || state !== types_1.OnboardingStep.DEPOSIT_SUCCESS || transactionResult) {
|
|
388
391
|
return;
|
|
389
392
|
}
|
|
390
393
|
var mockTransactionId = (_a = context.transactionId) !== null && _a !== void 0 ? _a : 'debug-tx-12345';
|
|
@@ -399,11 +402,12 @@ export var DepositFlowProvider = function (_a) {
|
|
|
399
402
|
toAddress: 'Nord Account',
|
|
400
403
|
networkName: fallbackChain,
|
|
401
404
|
status: 'Completed',
|
|
402
|
-
explorerUrl: getExplorerUrl(mockTransactionId),
|
|
405
|
+
explorerUrl: (0, transaction_1.getExplorerUrl)(mockTransactionId),
|
|
403
406
|
});
|
|
404
407
|
}, [isDebugOverride, state, transactionResult, context, address]);
|
|
405
|
-
return (
|
|
408
|
+
return ((0, jsx_runtime_1.jsx)(DepositFlowContext.Provider, { value: contextValue, children: children }));
|
|
406
409
|
};
|
|
410
|
+
exports.DepositFlowProvider = DepositFlowProvider;
|
|
407
411
|
var delay = function (ms) {
|
|
408
412
|
return new Promise(function (resolve) {
|
|
409
413
|
setTimeout(resolve, ms);
|
|
@@ -415,7 +419,7 @@ var waitForTransactionSlot = function (connection, signature) { return __awaiter
|
|
|
415
419
|
return __generator(this, function (_b) {
|
|
416
420
|
switch (_b.label) {
|
|
417
421
|
case 0:
|
|
418
|
-
logger.debug('Waiting for Solana confirmation for deposit', { signature: signature });
|
|
422
|
+
logger_1.logger.debug('Waiting for Solana confirmation for deposit', { signature: signature });
|
|
419
423
|
deadline = Date.now() + SLOT_LOOKUP_TIMEOUT_MS;
|
|
420
424
|
_b.label = 1;
|
|
421
425
|
case 1:
|
|
@@ -445,7 +449,7 @@ var waitForDepositEventIndex = function (protonClient, recipient, slot) { return
|
|
|
445
449
|
return __generator(this, function (_a) {
|
|
446
450
|
switch (_a.label) {
|
|
447
451
|
case 0:
|
|
448
|
-
logger.debug('Polling Proton for deposit entry', { slot: slot });
|
|
452
|
+
logger_1.logger.debug('Polling Proton for deposit entry', { slot: slot });
|
|
449
453
|
deadline = Date.now() + DEPOSIT_EVENT_TIMEOUT_MS;
|
|
450
454
|
_a.label = 1;
|
|
451
455
|
case 1:
|
|
@@ -486,7 +490,7 @@ var waitForNordAcknowledgement = function (nord, targetEventIndex) { return __aw
|
|
|
486
490
|
return __generator(this, function (_a) {
|
|
487
491
|
switch (_a.label) {
|
|
488
492
|
case 0:
|
|
489
|
-
logger.debug('Polling Nord for deposit acknowledgement', {
|
|
493
|
+
logger_1.logger.debug('Polling Nord for deposit acknowledgement', {
|
|
490
494
|
targetEventIndex: targetEventIndex,
|
|
491
495
|
});
|
|
492
496
|
deadline = Date.now() + NORD_ACK_TIMEOUT_MS;
|
|
@@ -515,11 +519,12 @@ var waitForNordAcknowledgement = function (nord, targetEventIndex) { return __aw
|
|
|
515
519
|
/**
|
|
516
520
|
* Hook to use the deposit flow context
|
|
517
521
|
*/
|
|
518
|
-
|
|
519
|
-
var context = useContext(DepositFlowContext);
|
|
522
|
+
var useDepositFlow = function () {
|
|
523
|
+
var context = (0, react_1.useContext)(DepositFlowContext);
|
|
520
524
|
if (context === undefined) {
|
|
521
525
|
throw new Error('useDepositFlow must be used within a DepositFlowProvider');
|
|
522
526
|
}
|
|
523
527
|
return context;
|
|
524
528
|
};
|
|
529
|
+
exports.useDepositFlow = useDepositFlow;
|
|
525
530
|
//# 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"]}
|