@stridge/kit 0.1.0-alpha.46 → 0.1.0-alpha.47
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/drivers/stridge/catalog.d.ts +6 -6
- package/dist/drivers/stridge/catalog.js +1 -1
- package/dist/drivers/stridge/createStridgeDepositDriver.d.ts +6 -6
- package/dist/drivers/stridge/createStridgeDepositDriver.js +1 -1
- package/dist/drivers/stridge/createStridgeWithdrawDriver.d.ts +7 -5
- package/dist/drivers/stridge/createStridgeWithdrawDriver.js +1 -1
- package/dist/flows/deposit/widgets/transfer-crypto/compound/types.d.ts +2 -2
- package/dist/flows/withdraw/driver/dto.d.ts +2 -2
- package/dist/flows/withdraw/driver/types.d.ts +1 -1
- package/dist/package.js +1 -1
- package/dist/shared/chains/index.d.ts +1 -1
- package/dist/shared/utils/logos/types.d.ts +1 -1
- package/dist/stridge/StridgeProvider.d.ts +1 -1
- package/package.json +2 -2
|
@@ -3,12 +3,12 @@ import { ApiClient, SupportedAssetsResponse } from "@stridge/sdk";
|
|
|
3
3
|
|
|
4
4
|
//#region src/drivers/stridge/catalog.d.ts
|
|
5
5
|
/**
|
|
6
|
-
* Provider-scoped shared `
|
|
6
|
+
* Provider-scoped shared `Gateway.assets()` cache. Deduplicates the catalog fetch across the
|
|
7
7
|
* deposit and withdraw drivers when both flows are mounted in a single `<StridgeProvider>` — they
|
|
8
8
|
* `await` the same in-flight promise and one network round-trip serves both flows.
|
|
9
9
|
*
|
|
10
|
-
* The catalog never invalidates within a single provider lifecycle — `
|
|
11
|
-
*
|
|
10
|
+
* The catalog never invalidates within a single provider lifecycle — `gateway/assets` is the
|
|
11
|
+
* merchant's catalog of routable chains / assets, which changes on the order of days, not user
|
|
12
12
|
* sessions. Hosts that need to invalidate unmount and remount the provider.
|
|
13
13
|
*
|
|
14
14
|
* BYO-driver hosts using `<KitProvider>` directly are unaffected — both `createStridge*Driver`
|
|
@@ -17,7 +17,7 @@ import { ApiClient, SupportedAssetsResponse } from "@stridge/sdk";
|
|
|
17
17
|
*/
|
|
18
18
|
interface StridgeCatalog {
|
|
19
19
|
/**
|
|
20
|
-
* Resolve the shared `
|
|
20
|
+
* Resolve the shared `gateway/assets` cache. First call kicks off the network fetch;
|
|
21
21
|
* subsequent calls return the same in-flight promise (or its resolved value).
|
|
22
22
|
*
|
|
23
23
|
* Resolves with `null` when the fetch fails — every consumer treats a missing catalog as a
|
|
@@ -36,7 +36,7 @@ interface CreateStridgeCatalogInput {
|
|
|
36
36
|
sdk?: ApiClient;
|
|
37
37
|
/**
|
|
38
38
|
* Stridge project key. Used to build a dedicated SDK client when `sdk` is not supplied. The
|
|
39
|
-
* key
|
|
39
|
+
* key authenticates `gateway/assets`, the merchant-filtered catalog endpoint.
|
|
40
40
|
*/
|
|
41
41
|
projectKey?: string;
|
|
42
42
|
/**
|
|
@@ -45,7 +45,7 @@ interface CreateStridgeCatalogInput {
|
|
|
45
45
|
environment?: StridgeEnvironment;
|
|
46
46
|
}
|
|
47
47
|
/**
|
|
48
|
-
* Build a {@link StridgeCatalog}. Wraps the `
|
|
48
|
+
* Build a {@link StridgeCatalog}. Wraps the `gateway/assets` call in the same one-shot retry
|
|
49
49
|
* helper the driver bootstrap uses so transient 5xx / 429 / network errors don't surface a hard
|
|
50
50
|
* "no catalog" state for the user.
|
|
51
51
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveSdkEnv as e}from"./internal/env.js";import{withOneShotRetry as t}from"./internal/retry.js";import{createApiClient as n}from"@stridge/sdk";function r(r){let i=r.sdk??n({projectKey:r.projectKey??``,env:e(r.environment)}),a=null;return{getSupportedAssets(){return a??=t(()=>i.
|
|
1
|
+
import{resolveSdkEnv as e}from"./internal/env.js";import{withOneShotRetry as t}from"./internal/retry.js";import{createApiClient as n}from"@stridge/sdk";function r(r){let i=r.sdk??n({projectKey:r.projectKey??``,env:e(r.environment)}),a=null;return{getSupportedAssets(){return a??=t(()=>i.gateway.assets()).catch(()=>null),a}}}export{r as createStridgeCatalog};
|
|
@@ -15,11 +15,11 @@ interface CreateStridgeDepositDriverInput extends StridgeDriverConfig {
|
|
|
15
15
|
*/
|
|
16
16
|
getI18n?: () => I18n;
|
|
17
17
|
/**
|
|
18
|
-
* Provider-scoped shared
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
18
|
+
* Provider-scoped shared catalog cache. When supplied, the driver awaits this single
|
|
19
|
+
* in-flight promise instead of issuing its own `Gateway.assets()` call — deduplicates the
|
|
20
|
+
* catalog fetch across deposit + withdraw drivers mounted under one `<StridgeProvider>`.
|
|
21
|
+
* When omitted, the driver falls back to its own per-instance fetch (the path BYO-driver
|
|
22
|
+
* hosts using `<KitProvider>` directly take).
|
|
23
23
|
*/
|
|
24
24
|
catalog?: StridgeCatalog;
|
|
25
25
|
}
|
|
@@ -28,7 +28,7 @@ interface CreateStridgeDepositDriverInput extends StridgeDriverConfig {
|
|
|
28
28
|
* `<KitProvider deposit={…}>` consumes this directly, no separate `dataSource` / `operations`
|
|
29
29
|
* adapter layer.
|
|
30
30
|
*
|
|
31
|
-
* Bootstrap kicks off `gateway/start` + `
|
|
31
|
+
* Bootstrap kicks off `gateway/start` + `Gateway.assets()` in parallel on creation; the
|
|
32
32
|
* driver's `brand`, `target`, and `addresses` entities transition `loading` → `ready` once both
|
|
33
33
|
* responses land. The first `balance/onchain` fetch fires alongside, populating `balances`.
|
|
34
34
|
* Wallet identity is published synchronously from `userAddress`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defaultI18n as e}from"../../shared/i18n/defaultI18n.js";import{NATIVE_QUOTE_ADDRESS as t,isStablecoinSymbol as n,toBaseUnits as r}from"./internal/encoding.js";import{resolveSdkEnv as i}from"./internal/env.js";import{buildKitMetadata as a}from"./internal/metadata.js";import{pollOnce as o}from"./internal/pollOnce.js";import{buildErc20OrNativeStep as s,signAndConfirm as c}from"./internal/signAndConfirm.js";import{buildEvmChainsParam as l}from"./internal/supportedChains.js";import{withOneShotRetry as u}from"./internal/retry.js";import{pickRelevantSettlement as d}from"../../flows/shared/transformers/pickRelevantSettlement.js";import{formatUsd as f}from"../../shared/format/formatUsd.js";import{balanceToBalancesPayload as p,buildRoutableAllowlist as m}from"../../flows/deposit/driver/transformers/balanceToBalancesPayload.js";import{quoteToPayload as h}from"../../flows/deposit/driver/transformers/quoteToPayload.js";import{settlementToPayload as g}from"../../flows/deposit/driver/transformers/settlementToPayload.js";import{startToAddressesPayload as _}from"../../flows/deposit/driver/transformers/startToAddressesPayload.js";import{startToBrandPayload as v}from"../../flows/deposit/driver/transformers/startToBrandPayload.js";import{startToTargetPayload as y}from"../../flows/deposit/driver/transformers/startToTargetPayload.js";import{walletAddressToWalletPayload as b}from"../../flows/deposit/driver/transformers/walletAddressToWalletPayload.js";import{defaultBlockExplorers as x}from"../../shared/utils/explorers.js";import{createEntityStore as ee}from"../stridge-mock/store.js";import{startPoll as S}from"./poll.js";import{createStridgeRpc as te}from"./rpc.js";import{createWagmiSigner as ne}from"./wagmiSigner.js";import{createApiClient as re}from"@stridge/sdk";function C(C){let w=re({projectKey:C.projectKey,env:i(C.environment)}),T=C.pollIntervals??{},E=T.detectionMs??2e3,D=T.processingMs??2e3,O=T.terminalMs??1e4,k=T.balancesMs??6e4,A=C.minAmountUsd,j=C.maxAmountUsd,M=C.getI18n??(()=>e),N={...x(),...C.explorers??{}},P=C.destination.network_id,F=C.destination.asset_symbol,I=C.destination.to_address??C.userAddress,L=C.rpc??te(),R={address:C.userAddress},z=ee({brand:{status:`idle`},target:{status:`idle`},addresses:{status:`idle`},balances:{status:`idle`},quote:{status:`idle`},settlement:{status:`idle`},wallet:{status:`ready`,payload:b(R),raw:R,response:R}}),B,V,H,U,W=C.wagmiConfig?ne({wagmiConfig:C.wagmiConfig,getSupportedAssets:()=>V,explorers:N}):void 0;function G(){if(V)return H??=m(V),H}let K=!1,q=Promise.resolve(),J=!1,Y=Promise.resolve(null),X=null;function Z(){K||(K=!0,q=ce(),Y=le())}async function ce(){z.update({brand:{status:`loading`},target:{status:`loading`},addresses:{status:`loading`},balances:{status:`loading`}});try{let[e,t]=await Promise.all([u(()=>w.gateway.start({owner:C.userAddress,destination:{network_id:P,to_address:I,asset_symbol:F},metadata:a({flow:`deposit`,...C.metadata?{hostMetadata:C.metadata}:{},extras:{destination:{networkId:P,assetSymbol:F}}})})),C.catalog?C.catalog.getSupportedAssets():u(()=>w.
|
|
1
|
+
import{defaultI18n as e}from"../../shared/i18n/defaultI18n.js";import{NATIVE_QUOTE_ADDRESS as t,isStablecoinSymbol as n,toBaseUnits as r}from"./internal/encoding.js";import{resolveSdkEnv as i}from"./internal/env.js";import{buildKitMetadata as a}from"./internal/metadata.js";import{pollOnce as o}from"./internal/pollOnce.js";import{buildErc20OrNativeStep as s,signAndConfirm as c}from"./internal/signAndConfirm.js";import{buildEvmChainsParam as l}from"./internal/supportedChains.js";import{withOneShotRetry as u}from"./internal/retry.js";import{pickRelevantSettlement as d}from"../../flows/shared/transformers/pickRelevantSettlement.js";import{formatUsd as f}from"../../shared/format/formatUsd.js";import{balanceToBalancesPayload as p,buildRoutableAllowlist as m}from"../../flows/deposit/driver/transformers/balanceToBalancesPayload.js";import{quoteToPayload as h}from"../../flows/deposit/driver/transformers/quoteToPayload.js";import{settlementToPayload as g}from"../../flows/deposit/driver/transformers/settlementToPayload.js";import{startToAddressesPayload as _}from"../../flows/deposit/driver/transformers/startToAddressesPayload.js";import{startToBrandPayload as v}from"../../flows/deposit/driver/transformers/startToBrandPayload.js";import{startToTargetPayload as y}from"../../flows/deposit/driver/transformers/startToTargetPayload.js";import{walletAddressToWalletPayload as b}from"../../flows/deposit/driver/transformers/walletAddressToWalletPayload.js";import{defaultBlockExplorers as x}from"../../shared/utils/explorers.js";import{createEntityStore as ee}from"../stridge-mock/store.js";import{startPoll as S}from"./poll.js";import{createStridgeRpc as te}from"./rpc.js";import{createWagmiSigner as ne}from"./wagmiSigner.js";import{createApiClient as re}from"@stridge/sdk";function C(C){let w=re({projectKey:C.projectKey,env:i(C.environment)}),T=C.pollIntervals??{},E=T.detectionMs??2e3,D=T.processingMs??2e3,O=T.terminalMs??1e4,k=T.balancesMs??6e4,A=C.minAmountUsd,j=C.maxAmountUsd,M=C.getI18n??(()=>e),N={...x(),...C.explorers??{}},P=C.destination.network_id,F=C.destination.asset_symbol,I=C.destination.to_address??C.userAddress,L=C.rpc??te(),R={address:C.userAddress},z=ee({brand:{status:`idle`},target:{status:`idle`},addresses:{status:`idle`},balances:{status:`idle`},quote:{status:`idle`},settlement:{status:`idle`},wallet:{status:`ready`,payload:b(R),raw:R,response:R}}),B,V,H,U,W=C.wagmiConfig?ne({wagmiConfig:C.wagmiConfig,getSupportedAssets:()=>V,explorers:N}):void 0;function G(){if(V)return H??=m(V),H}let K=!1,q=Promise.resolve(),J=!1,Y=Promise.resolve(null),X=null;function Z(){K||(K=!0,q=ce(),Y=le())}async function ce(){z.update({brand:{status:`loading`},target:{status:`loading`},addresses:{status:`loading`},balances:{status:`loading`}});try{let[e,t]=await Promise.all([u(()=>w.gateway.start({owner:C.userAddress,destination:{network_id:P,to_address:I,asset_symbol:F},metadata:a({flow:`deposit`,...C.metadata?{hostMetadata:C.metadata}:{},extras:{destination:{networkId:P,assetSymbol:F}}})})),C.catalog?C.catalog.getSupportedAssets():u(()=>w.gateway.assets()).catch(()=>null)]);B=e;let n=e.metadata?.brand_name;typeof n==`string`&&n.trim().length>0&&(U=n.trim());let r=M();if(t&&(V=t,H=void 0),z.update({brand:{status:`ready`,payload:v(e.metadata),raw:e.metadata,response:e},addresses:{status:`ready`,payload:_(e.deposit_addresses,{i18n:r,explorers:N,...t?{chainLogos:ae(t)}:{},...t?{minAmountUsdByEip155Id:se(t,A),nativeAssetByEip155Id:oe(t)}:{}}),raw:e.deposit_addresses,response:e}}),t){let e=y(t,{i18n:r,networkId:P,assetSymbol:F,minAmountUsd:A,...j===void 0?{}:{maxAmountUsd:j}}),n=t.assets.find(e=>String(e.network_id)===P);e&&n?z.update({target:{status:`ready`,payload:e,raw:n,response:t}}):z.update({target:{status:`error`,error:Error(`Destination not found in supportedAssets catalog.`)}})}else z.update({target:{status:`error`,error:Error(`supportedAssets fetch failed.`)}})}catch(e){let t=e instanceof Error?e:Error(String(e));z.update({brand:{status:`error`,error:t},target:{status:`error`,error:t},addresses:{status:`error`,error:t}})}}async function le(){try{await q;let e=l(V),t=await u(()=>w.balance.onchain(C.userAddress,{includeSpam:!1,includeZero:!1,...e?{chains:e}:{}}));X=Date.now();let n=G();if(!n)return z.update({balances:{status:`ready`,payload:[],raw:t,response:t}}),t;let r=p(t,{i18n:M(),routable:n,minAmountUsd:A,...C.resolveTokenIcon?{resolveTokenIcon:C.resolveTokenIcon}:{}});return z.update({balances:{status:`ready`,payload:r,raw:t,response:t},wallet:Q(r,M())}),t}catch(e){let t=e instanceof Error?e:Error(String(e));return z.update({balances:{status:`error`,error:t}}),null}}function Q(e,t){let n=e.reduce((e,t)=>e+(t.amountUsd?.value??0),0);return{status:`ready`,payload:{...b(R),balanceTotalUsd:{value:n,formatted:f(n,t)}},raw:R,response:R}}return{getSnapshot(){return z.getSnapshot()},subscribe(e){return z.subscribe(e)},arm:Z,async requestQuote(e,i){if(Z(),z.update({quote:{status:`loading`}}),await q,i.aborted)return;let a=B;if(!a){z.update({quote:{status:`error`,error:Error(`gateway/start not yet resolved.`)}});return}try{let o=e.sourceChainId,s=e.sourceIsNative?t:e.sourceTokenAddress,c=r(e.amount,e.sourceTokenDecimals),l=await w.uda.quote({fromNetworkId:o,fromAsset:s,toNetworkId:Number(a.destination.eip155_id),toAsset:a.destination.asset_address||`0x0000000000000000000000000000000000000000`,amount:c,fromAddress:C.userAddress,toAddress:I},{signal:i});if(i.aborted)return;let u=M(),d={chainId:o,networkName:ie(o),eip155Id:String(o),symbol:e.sourceTokenSymbol,decimals:e.sourceTokenDecimals,address:e.sourceTokenAddress,isNative:e.sourceIsNative},f={chainId:Number(a.destination.eip155_id),networkName:a.destination.network_name,eip155Id:a.destination.eip155_id,symbol:a.destination.asset_symbol,decimals:a.destination.asset_decimals,address:a.destination.asset_address,isNative:!a.destination.asset_address},p=n(a.destination.asset_symbol)?1:void 0,m=h(l,{i18n:u,sendSide:d,receiveSide:f,sourceAmount:e.amount,now:Date.now(),...e.sourcePriceUsd===void 0?{}:{sendPriceUsd:e.sourcePriceUsd},...p===void 0?{}:{receivePriceUsd:p}});z.update({quote:{status:`ready`,payload:m,raw:l,response:l}})}catch(e){if(i.aborted)return;let t=e instanceof Error?e:Error(String(e));z.update({quote:{status:`error`,error:t}})}},async submitDeposit(e,t){if(!W)throw Error(`Connect a wallet to sign and submit the deposit.`);if(Z(),await q,t.aborted)throw new DOMException(`Aborted`,`AbortError`);let n=B;if(!n)throw Error(`gateway/start not yet resolved.`);let r=n.deposit_addresses.find(t=>Number(t.eip155_id)===Number(e.sourceChainId));if(!r)throw Error(`No Stridge deposit address provisioned on chain ${e.sourceChainId}. Pick a supported source chain.`);return c({signer:W,rpc:L,step:s({chainId:e.sourceChainId,from:C.userAddress,udaDepositAddress:r.address,amount:e.amount,decimals:e.sourceTokenDecimals,isNative:e.sourceIsNative,...e.sourceIsNative?{}:{sourceTokenAddress:e.sourceTokenAddress}}),signal:t,explorers:N,...C.receiptConfirmations===void 0?{}:{receiptConfirmations:C.receiptConfirmations},...C.receiptPollingIntervalMs===void 0?{}:{receiptPollingIntervalMs:C.receiptPollingIntervalMs}})},watchBalances(e,t,n){Z(),S({signal:n,fetch:async e=>{if(!J)return J=!0,Y;if(X!==null&&Date.now()-X<3e4)return z.getSnapshot().balances;try{await q;let t=l(V),n=await w.balance.onchain(C.userAddress,{signal:e,includeSpam:!1,includeZero:!1,...t?{chains:t}:{}});X=Date.now();let r=G();if(!r)return z.update({balances:{status:`ready`,payload:[],raw:n,response:n}}),null;let i=p(n,{i18n:M(),routable:r,minAmountUsd:A,...C.resolveTokenIcon?{resolveTokenIcon:C.resolveTokenIcon}:{}});return z.update({balances:{status:`ready`,payload:i,raw:n,response:n},wallet:Q(i,M())}),n}catch{return null}},listener:()=>{t(z.getSnapshot().balances)},nextIntervalMs:()=>k})},watchSourceTx(e,t,n){Z();let r=new Set,i={current:!1},a=!1;S({signal:n,fetch:e=>o(w,C.userAddress,$(),e),listener:e=>{if(a||!e)return;let n=e.settlements??[];if(!i.current){for(let e of n)r.add(e.id);i.current=!0;return}let o=n.find(e=>!r.has(e.id));if(!o)return;a=!0;let s=Number(o.from?.eip155_id??`0`);t({hash:o.from?.tx_id??``,...N[s]&&o.from?.tx_id?{explorerUrl:`${N[s].replace(/\/+$/,``)}/tx/${o.from.tx_id}`}:{}})},nextIntervalMs:()=>a?0:E})},watchSettlement(e,t,n){let r=e=>o(w,C.userAddress,$(),e),i=!1;S({signal:n,fetch:r,listener:n=>{if(!n)return;let r=d(n,{txHash:e.tx.hash});if(!r)return;let a=g(r,n,{i18n:M(),sourceWallet:{name:`Wallet`,address:C.userAddress},explorers:N,...U?{brandName:U}:{}});a.kind!==`pending`&&(i=!0);let o={status:`ready`,payload:a,raw:r,response:n};z.update({settlement:o}),t(o)},nextIntervalMs:()=>i?O:D})},async fetchActiveSettlement(e,t){let n=await o(w,C.userAddress,$(),t);if(!n)return null;let r=d(n);if(!r)return null;let i=g(r,n,{i18n:M(),sourceWallet:{name:`Wallet`,address:C.userAddress},explorers:N,...U?{brandName:U}:{}});return i.kind===`pending`?{payload:i,raw:r,response:n}:null}};function $(){return{network_id:P,asset_symbol:F,to_address:I}}}function ie(e){switch(e){case 1:return`Ethereum`;case 56:return`BSC`;case 137:return`Polygon`;case 42161:return`Arbitrum`;case 10:return`Optimism`;case 8453:return`Base`;default:return`Chain ${e}`}}function ae(e){let t={};for(let n of e.assets){let e=String(n.eip155_id),r=n.native_currency?.logo;r&&(t[e]=r)}return t}function oe(e){let t={};for(let n of e.assets){let e=n.native_currency;if(!e?.symbol)continue;let r=String(n.eip155_id);t[r]={symbol:e.symbol,address:``,decimals:typeof e.decimals==`number`?e.decimals:18,isNative:!0,...e.logo?{assetLogoUrl:e.logo}:{}}}return t}function se(e,t){let n={};for(let r of e.assets){let e=String(r.eip155_id),i=r.native_currency?.min_deposit_usd,a=typeof i==`string`&&i.trim().length>0?Number.parseFloat(i):NaN;n[e]=Number.isFinite(a)?a:t}return n}export{C as createStridgeDepositDriver};
|
|
@@ -107,10 +107,10 @@ interface CreateStridgeWithdrawDriverInput {
|
|
|
107
107
|
*/
|
|
108
108
|
maxAmountUsd?: number;
|
|
109
109
|
/**
|
|
110
|
-
* Provider-scoped shared
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
110
|
+
* Provider-scoped shared catalog cache. When supplied, the driver awaits this single
|
|
111
|
+
* in-flight promise instead of issuing its own `Gateway.assets()` call — deduplicates the
|
|
112
|
+
* catalog fetch across deposit + withdraw drivers mounted under one `<StridgeProvider>`.
|
|
113
|
+
* When omitted, the driver falls back to its own per-instance fetch.
|
|
114
114
|
*/
|
|
115
115
|
catalog?: StridgeCatalog;
|
|
116
116
|
}
|
|
@@ -119,7 +119,9 @@ interface CreateStridgeWithdrawDriverInput {
|
|
|
119
119
|
* `<KitProvider withdraw={…}>` consumes this directly, no separate `dataSource` / `operations`
|
|
120
120
|
* adapter layer.
|
|
121
121
|
*
|
|
122
|
-
* Bootstrap
|
|
122
|
+
* Bootstrap is lazy — `Gateway.assets()` and `balance/onchain` fire on the first `arm()`, not
|
|
123
|
+
* at construction. Inside `arm()` the two calls run sequentially (assets first so its EVM chain
|
|
124
|
+
* list can be threaded as the `chains` filter on the initial `balance/onchain` call). The
|
|
123
125
|
* `receiveOptions` entity transitions `loading → ready` once supportedAssets lands; the
|
|
124
126
|
* `withdrawableBalances` entity flips `loading → ready` after the first balance fetch (and the
|
|
125
127
|
* supportedAssets-derived source-currency lookup completes).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{defaultI18n as e}from"../../shared/i18n/defaultI18n.js";import{NATIVE_QUOTE_ADDRESS as t,isStablecoinSymbol as n,toBaseUnits as r}from"./internal/encoding.js";import{resolveSdkEnv as i}from"./internal/env.js";import{buildKitMetadata as a}from"./internal/metadata.js";import{pollOnce as o}from"./internal/pollOnce.js";import{buildEvmChainsParam as s}from"./internal/supportedChains.js";import{withOneShotRetry as c}from"./internal/retry.js";import{pickRelevantSettlement as l}from"../../flows/shared/transformers/pickRelevantSettlement.js";import{formatUsd as u}from"../../shared/format/formatUsd.js";import{defaultBlockExplorers as d}from"../../shared/utils/explorers.js";import{createEntityStore as f}from"../stridge-mock/store.js";import{startPoll as p}from"./poll.js";import{balanceToWithdrawableBalancesPayload as m}from"../../flows/withdraw/driver/transformers/balanceToWithdrawableBalancesPayload.js";import{quoteToWithdrawalPayload as h}from"../../flows/withdraw/driver/transformers/quoteToWithdrawalPayload.js";import{settlementToWithdrawalPayload as g}from"../../flows/withdraw/driver/transformers/settlementToWithdrawalPayload.js";import{supportedAssetsToReceiveOptionsPayload as _}from"../../flows/withdraw/driver/transformers/supportedAssetsToReceiveOptionsPayload.js";import{createApiClient as v}from"@stridge/sdk";function y(y){let b=v({projectKey:y.projectKey,env:i(y.environment)}),x=y.pollIntervals??{},S=x.processingMs??2e3,C=x.terminalMs??1e4,w=x.balancesMs??6e4,T=y.getI18n??(()=>e),E={...d(),...y.explorers??{}},D=T(),O=f({withdrawableBalances:{status:`idle`},receiveOptions:{status:`idle`},quote:{status:`idle`},settlement:{status:`idle`},...y.minAmountUsd===void 0?{}:{minAmountUsd:{value:y.minAmountUsd,formatted:u(y.minAmountUsd,D)}},...y.maxAmountUsd===void 0?{}:{maxAmountUsd:{value:y.maxAmountUsd,formatted:u(y.maxAmountUsd,D)}}}),k,A,j;function M(e){let t=e.assets.find(e=>e.network_id===y.currency.networkId);if(!t)return;let n=y.currency.assetSymbol.toUpperCase(),r=t.native_currency?.symbol?.toUpperCase()===n?t.native_currency:void 0,i=t.assets.find(e=>e.symbol?.toUpperCase()===n),a={networkId:t.network_id,eip155Id:t.eip155_id,networkName:t.network_name,...t.native_currency?.logo?{chainLogoUrl:t.native_currency.logo}:{},decimals:i?.decimals??r?.decimals??18,address:i?.address??``,isNative:!i&&!!r,...i?.logo?{assetLogoUrl:i.logo}:r?.logo?{assetLogoUrl:r.logo}:{}};return i||r?a:void 0}function N(e){let t=T(),n=A,r=m(e,{i18n:t,networkId:y.currency.networkId,assetSymbol:y.currency.assetSymbol,...n?{fallbackMeta:{decimals:n.decimals,address:n.address,isNative:n.isNative,eip155Id:String(n.eip155Id),networkName:n.networkName,...n.chainLogoUrl?{chainLogoUrl:n.chainLogoUrl}:{},...n.assetLogoUrl?{assetLogoUrl:n.assetLogoUrl}:{}}}:{}});O.update({withdrawableBalances:{status:`ready`,payload:r,raw:e,response:e}})}let P=!1,F=Promise.resolve(),I=!1,L=null;function R(){P||(P=!0,F=z())}async function z(){O.update({withdrawableBalances:{status:`loading`},receiveOptions:{status:`loading`}});let e=y.catalog?await y.catalog.getSupportedAssets():await c(()=>b.
|
|
1
|
+
"use client";import{defaultI18n as e}from"../../shared/i18n/defaultI18n.js";import{NATIVE_QUOTE_ADDRESS as t,isStablecoinSymbol as n,toBaseUnits as r}from"./internal/encoding.js";import{resolveSdkEnv as i}from"./internal/env.js";import{buildKitMetadata as a}from"./internal/metadata.js";import{pollOnce as o}from"./internal/pollOnce.js";import{buildEvmChainsParam as s}from"./internal/supportedChains.js";import{withOneShotRetry as c}from"./internal/retry.js";import{pickRelevantSettlement as l}from"../../flows/shared/transformers/pickRelevantSettlement.js";import{formatUsd as u}from"../../shared/format/formatUsd.js";import{defaultBlockExplorers as d}from"../../shared/utils/explorers.js";import{createEntityStore as f}from"../stridge-mock/store.js";import{startPoll as p}from"./poll.js";import{balanceToWithdrawableBalancesPayload as m}from"../../flows/withdraw/driver/transformers/balanceToWithdrawableBalancesPayload.js";import{quoteToWithdrawalPayload as h}from"../../flows/withdraw/driver/transformers/quoteToWithdrawalPayload.js";import{settlementToWithdrawalPayload as g}from"../../flows/withdraw/driver/transformers/settlementToWithdrawalPayload.js";import{supportedAssetsToReceiveOptionsPayload as _}from"../../flows/withdraw/driver/transformers/supportedAssetsToReceiveOptionsPayload.js";import{createApiClient as v}from"@stridge/sdk";function y(y){let b=v({projectKey:y.projectKey,env:i(y.environment)}),x=y.pollIntervals??{},S=x.processingMs??2e3,C=x.terminalMs??1e4,w=x.balancesMs??6e4,T=y.getI18n??(()=>e),E={...d(),...y.explorers??{}},D=T(),O=f({withdrawableBalances:{status:`idle`},receiveOptions:{status:`idle`},quote:{status:`idle`},settlement:{status:`idle`},...y.minAmountUsd===void 0?{}:{minAmountUsd:{value:y.minAmountUsd,formatted:u(y.minAmountUsd,D)}},...y.maxAmountUsd===void 0?{}:{maxAmountUsd:{value:y.maxAmountUsd,formatted:u(y.maxAmountUsd,D)}}}),k,A,j;function M(e){let t=e.assets.find(e=>e.network_id===y.currency.networkId);if(!t)return;let n=y.currency.assetSymbol.toUpperCase(),r=t.native_currency?.symbol?.toUpperCase()===n?t.native_currency:void 0,i=t.assets.find(e=>e.symbol?.toUpperCase()===n),a={networkId:t.network_id,eip155Id:t.eip155_id,networkName:t.network_name,...t.native_currency?.logo?{chainLogoUrl:t.native_currency.logo}:{},decimals:i?.decimals??r?.decimals??18,address:i?.address??``,isNative:!i&&!!r,...i?.logo?{assetLogoUrl:i.logo}:r?.logo?{assetLogoUrl:r.logo}:{}};return i||r?a:void 0}function N(e){let t=T(),n=A,r=m(e,{i18n:t,networkId:y.currency.networkId,assetSymbol:y.currency.assetSymbol,...n?{fallbackMeta:{decimals:n.decimals,address:n.address,isNative:n.isNative,eip155Id:String(n.eip155Id),networkName:n.networkName,...n.chainLogoUrl?{chainLogoUrl:n.chainLogoUrl}:{},...n.assetLogoUrl?{assetLogoUrl:n.assetLogoUrl}:{}}}:{}});O.update({withdrawableBalances:{status:`ready`,payload:r,raw:e,response:e}})}let P=!1,F=Promise.resolve(),I=!1,L=null;function R(){P||(P=!0,F=z())}async function z(){O.update({withdrawableBalances:{status:`loading`},receiveOptions:{status:`loading`}});let e=y.catalog?await y.catalog.getSupportedAssets():await c(()=>b.gateway.assets()).catch(()=>null);if(e){k=e,A=M(e);let t=_(e);O.update({receiveOptions:{status:`ready`,payload:t,raw:e.assets,response:e}})}else O.update({receiveOptions:{status:`error`,error:Error(`supportedAssets fetch failed.`)}});let t=s(e??void 0),n=await c(()=>b.balance.onchain(y.userAddress,{includeSpam:!1,includeZero:!1,...t?{chains:t}:{}})).catch(()=>null);n?(L=Date.now(),N(n)):N({wallet_address:y.userAddress,fetched_at:new Date().toISOString(),total_usd:`0`,chains:[]})}function B(){return a({flow:`withdraw`,...y.metadata?{hostMetadata:y.metadata}:{},extras:{source:{networkId:y.currency.networkId,assetSymbol:y.currency.assetSymbol}}})}function V(e,t){if(!k)return;let n=k.assets.find(t=>t.eip155_id===e);if(!n)return;let r=t.toUpperCase(),i=n.native_currency?.symbol?.toUpperCase()===r?n.native_currency:void 0,a=n.assets.find(e=>e.symbol?.toUpperCase()===r);if(!(!i&&!a))return{chainId:n.eip155_id,symbol:a?.symbol??i?.symbol??t,decimals:a?.decimals??i?.decimals??18,address:a?.address??``,isNative:!a&&!!i,...a?.logo?{assetLogoUrl:a.logo}:i?.logo?{assetLogoUrl:i.logo}:{},networkId:n.network_id,networkName:n.network_name,...i?.logo?{chainLogoUrl:i.logo}:{}}}function H(e){let t=O.getSnapshot().receiveOptions;if(!(t.status!==`ready`&&t.status!==`stale`))return t.payload.find(t=>t.eip155Id===e)}return{getSnapshot(){return O.getSnapshot()},subscribe(e){return O.subscribe(e)},arm:R,async requestQuote(e,i){R(),O.update({quote:{status:`loading`}});try{if(await F,i.aborted)return;let a=A;if(!a)throw Error(`Stridge withdraw driver: source currency ${y.currency.assetSymbol} not found on network ${y.currency.networkId} in supportedAssets.`);let o=V(e.receiveChainId,e.receiveTokenSymbol);if(!o)throw Error(`Stridge withdraw driver: receive asset ${e.receiveTokenSymbol} not found on chain ${e.receiveChainId} in supportedAssets.`);let s=r(e.amount,a.decimals),c=await b.uda.quote({fromNetworkId:a.eip155Id,fromAsset:a.isNative?t:a.address,toNetworkId:o.chainId,toAsset:o.isNative?t:o.address,amount:s,fromAddress:y.userAddress,toAddress:e.recipientAddress},{signal:i});if(i.aborted)return;let l=n(y.currency.assetSymbol)?1:void 0,u=n(o.symbol)?1:void 0,d=h(c,{i18n:T(),receiveSide:o,sourceAmount:e.amount,sendDecimals:a.decimals,sendSymbol:y.currency.assetSymbol,now:Date.now(),...l===void 0?{}:{sendPriceUsd:l},...u===void 0?{}:{receivePriceUsd:u}});O.update({quote:{status:`ready`,payload:d,raw:c,response:c}})}catch(e){if(i.aborted)return;let t=e instanceof Error?e:Error(String(e));O.update({quote:{status:`error`,error:t}})}},async prepareWithdrawal(e,t){if(R(),await F,t.aborted)throw new DOMException(`Aborted`,`AbortError`);let n=A;if(!n)throw Error(`Stridge withdraw driver: source currency ${y.currency.assetSymbol} not found on network ${y.currency.networkId} in supportedAssets.`);let r=V(e.receiveChainId,e.receiveTokenSymbol);if(!r)throw Error(`Stridge withdraw driver: receive asset ${e.receiveTokenSymbol} not found on chain ${e.receiveChainId} in supportedAssets.`);let i=await b.gateway.start({owner:y.userAddress,destination:{network_id:r.networkId??String(e.receiveChainId),asset_symbol:r.symbol,to_address:e.recipientAddress},metadata:B()},{signal:t});if(t.aborted)throw new DOMException(`Aborted`,`AbortError`);let a=i.deposit_addresses.find(e=>Number(e.eip155_id)===n.eip155Id);if(!a)throw Error(`Stridge withdraw driver: no UDA deposit address provisioned on chain ${n.eip155Id} for the brand currency. Check that supportedAssets advertises this chain.`);return j={network_id:r.networkId??String(e.receiveChainId),asset_symbol:r.symbol,to_address:e.recipientAddress},{depositTarget:{address:a.address,chainId:n.eip155Id,tokenSymbol:y.currency.assetSymbol,tokenAddress:n.isNative?``:n.address,tokenDecimals:n.decimals,isNative:n.isNative,amount:e.amount},correlation:{owner:y.userAddress}}},watchSettlement(e,t,n){let i=e=>o(b,y.userAddress,j,e),a=!1;p({signal:n,fetch:i,listener:n=>{if(!n)return;let i=A?r(e.form.amount,A.decimals).toString():void 0,o=e.tx?.hash?l(n,{txHash:e.tx.hash}):l(n,{bestMatch:{destination:{chainId:e.form.receiveChainId,tokenSymbol:e.form.receiveTokenSymbol,recipientAddress:e.form.recipientAddress},submittedAt:e.submittedAt,...i?{sourceAmountBaseUnits:i}:{}}});if(!o)return;let s=T(),c=H(Number(n.destination.eip155_id)),u=c?.tokens.find(e=>e.symbol===n.destination.asset_symbol),d={...c?.chainLogoUrl?{chainLogoUrl:c.chainLogoUrl}:{},...u?.assetLogoUrl?{assetLogoUrl:u.assetLogoUrl}:{},...c?.networkName?{networkName:c.networkName}:{}},f=g(o,n,{i18n:s,explorers:E,...Object.keys(d).length>0?{receiveAssetEnrichment:d}:{},...u?.decimals===void 0?{}:{receiveAssetDecimals:u.decimals}});f.kind!==`pending`&&(a=!0);let p={status:`ready`,payload:f,raw:o,response:n};O.update({settlement:p}),t(p)},nextIntervalMs:()=>a?C:S})},watchWithdrawableBalances(e,t,n){R(),p({signal:n,fetch:async e=>{if(!I){I=!0,await F;let e=O.getSnapshot().withdrawableBalances;return e.status===`ready`||e.status===`stale`?e.response:null}if(L!==null&&Date.now()-L<3e4)return null;try{if(await F,e.aborted)return null;let t=s(k),n=await b.balance.onchain(y.userAddress,{signal:e,includeSpam:!1,includeZero:!1,...t?{chains:t}:{}});return L=Date.now(),n}catch{return null}},listener:e=>{e&&N(e),t(O.getSnapshot().withdrawableBalances)},nextIntervalMs:()=>w})}}}export{y as createStridgeWithdrawDriver};
|
|
@@ -58,7 +58,7 @@ interface TransferCryptoChain extends TransferCryptoAsset {
|
|
|
58
58
|
*/
|
|
59
59
|
raw?: SupportedAssetDto;
|
|
60
60
|
/**
|
|
61
|
-
* Full `
|
|
61
|
+
* Full `Gateway.assets()` response that produced the network entry.
|
|
62
62
|
*/
|
|
63
63
|
responseRaw?: SupportedAssetsResponse;
|
|
64
64
|
}
|
|
@@ -73,7 +73,7 @@ interface TransferCryptoToken extends TransferCryptoAsset {
|
|
|
73
73
|
* per-chain `raw` walk `chainsByToken[symbol]`.
|
|
74
74
|
*/
|
|
75
75
|
raw?: AssetDto | NativeCurrencyDto;
|
|
76
|
-
/** Full `
|
|
76
|
+
/** Full `Gateway.assets()` response that produced the token entry. */
|
|
77
77
|
responseRaw?: SupportedAssetsResponse;
|
|
78
78
|
}
|
|
79
79
|
/**
|
|
@@ -29,12 +29,12 @@ type WithdrawalSettlementDto = GatewaySettlementDto;
|
|
|
29
29
|
*/
|
|
30
30
|
type WithdrawalSettlementResponse = GatewayUdaDto;
|
|
31
31
|
/**
|
|
32
|
-
* Per-network entry from `
|
|
32
|
+
* Per-network entry from `Gateway.assets()`. Surfaced as the `raw` slot on the
|
|
33
33
|
* `receiveOptions` entity so headless integrators can navigate the catalog without re-fetching.
|
|
34
34
|
*/
|
|
35
35
|
type ReceiveOptionDto = SupportedAssetDto;
|
|
36
36
|
/**
|
|
37
|
-
* Full `
|
|
37
|
+
* Full `Gateway.assets()` response. Drives the receive chain + receive token dropdowns on
|
|
38
38
|
* the form.
|
|
39
39
|
*/
|
|
40
40
|
type ReceiveOptionsResponse = SupportedAssetsResponse;
|
|
@@ -25,7 +25,7 @@ interface WithdrawSnapshot {
|
|
|
25
25
|
withdrawableBalances: Entity<ReadonlyArray<WithdrawableBalanceItemPayload>, WithdrawableBalancesResponse, WithdrawableBalancesResponse>;
|
|
26
26
|
/**
|
|
27
27
|
* Per-chain catalog of routable receive destinations. Drives the form's "Receive chain" /
|
|
28
|
-
* "Receive token" pickers. Derived from `
|
|
28
|
+
* "Receive token" pickers. Derived from `Gateway.assets()`.
|
|
29
29
|
*/
|
|
30
30
|
receiveOptions: Entity<ReadonlyArray<ReceiveChainPayload>, ReadonlyArray<ReceiveOptionDto>, ReceiveOptionsResponse>;
|
|
31
31
|
/**
|
package/dist/package.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=`0.1.0-alpha.
|
|
1
|
+
var e=`0.1.0-alpha.47`;export{e as version};
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* The kit does not ship a static chain catalog — the gateway is the single source of truth for
|
|
6
6
|
* which networks exist. Consumers pass the Stridge network id (read straight off
|
|
7
|
-
* `
|
|
7
|
+
* `Gateway.assets()`) as `StridgeAsset.networkId`, and the kit forwards it to
|
|
8
8
|
* `gateway/start` verbatim. This module only carries the chain-*family* tag (`ChainType`) and
|
|
9
9
|
* the address-shape validators that depend on it.
|
|
10
10
|
*/
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* Trustwallet CDN and the gradient+letter fallback. Use when a definitive logo URL is
|
|
10
10
|
* available and no CDN probing is desired.
|
|
11
11
|
* - `logoUrl` — appended after the CDN candidates. Used when the convention URLs 404. Typical
|
|
12
|
-
* source: a backend's per-token `logo` field (e.g. Stridge's `
|
|
12
|
+
* source: a backend's per-token `logo` field (e.g. Stridge's `Gateway.assets()` payload).
|
|
13
13
|
*/
|
|
14
14
|
interface TokenLogoInput {
|
|
15
15
|
/**
|
|
@@ -11,7 +11,7 @@ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
|
|
|
11
11
|
//#region src/stridge/StridgeProvider.d.ts
|
|
12
12
|
/**
|
|
13
13
|
* Settlement-asset tuple. `networkId` is the Stridge network id — the wire value the gateway
|
|
14
|
-
* routes against, read straight off `
|
|
14
|
+
* routes against, read straight off `Gateway.assets()` (`"9006"` for BSC, `"195"` for
|
|
15
15
|
* Tron, …). The kit forwards it to `gateway/start` verbatim; it does not ship a chain catalog,
|
|
16
16
|
* so any network the backend lists works without a kit release. `symbol` is the asset symbol
|
|
17
17
|
* on that network (e.g. `"USDC"`).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stridge/kit",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.47",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -135,7 +135,7 @@
|
|
|
135
135
|
"@stylexjs/stylex": "^0.18.3",
|
|
136
136
|
"motion": "^12.38.0",
|
|
137
137
|
"qr": "0.6.0",
|
|
138
|
-
"@stridge/sdk": "0.1.0-alpha.
|
|
138
|
+
"@stridge/sdk": "0.1.0-alpha.6"
|
|
139
139
|
},
|
|
140
140
|
"scripts": {
|
|
141
141
|
"build": "pnpm run i18n:compile && tsdown",
|