@funkit/connect 9.13.0 → 9.15.0
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/CHANGELOG.md +54 -0
- package/dist/__generated__/default_configs.d.ts +8 -11
- package/dist/__generated__/default_feature_gates.d.ts +3 -2
- package/dist/clients/aave.d.ts +92 -0
- package/dist/clients/aave.js +156 -0
- package/dist/clients/{chunk-LMEQD56M.js → chunk-PLDXBAAH.js} +2 -1
- package/dist/clients/fanatics.js +1 -1
- package/dist/clients/lighter.d.ts +33 -2
- package/dist/clients/lighter.js +124 -2
- package/dist/clients/polymarket.d.ts +30 -1
- package/dist/clients/polymarket.js +153 -4
- package/dist/components/CopyAddress/CopyInputDisplayedAddress.css.d.ts +1 -0
- package/dist/components/CopyAddress/CopyInputDisplayedAddress.d.ts +6 -0
- package/dist/components/FreeUsdcBanner/FreeUsdcBanner.d.ts +5 -0
- package/dist/components/FunPayments/FunPaymentMethods.d.ts +16 -0
- package/dist/components/Icons/CashAppIcon.d.ts +4 -0
- package/dist/consts/customers.d.ts +8 -0
- package/dist/consts/polymarket.d.ts +7 -0
- package/dist/domains/paymentMethods.d.ts +9 -1
- package/dist/domains/quote.d.ts +11 -0
- package/dist/hooks/usePaymentSources.d.ts +1 -0
- package/dist/index.css +22 -15
- package/dist/index.js +3017 -2395
- package/dist/modals/CheckoutModal/InputAmount/InputAmount.d.ts +4 -0
- package/dist/modals/CheckoutModal/InputAmount/aaveClient.d.ts +20 -0
- package/dist/modals/CheckoutModal/InputAmount/useAaveNativeSupply.d.ts +44 -0
- package/dist/modals/CheckoutModal/SourceChange/SourceChange.d.ts +8 -0
- package/dist/modals/CheckoutModal/SourceChange/SourceList.d.ts +7 -1
- package/dist/modals/CheckoutModal/SourceChange/buildSourceGroups.d.ts +31 -8
- package/dist/modals/WithdrawalModal/WithdrawAmountInput.d.ts +10 -4
- package/dist/modals/WithdrawalModal/WithdrawalContent.d.ts +32 -1
- package/dist/modals/WithdrawalModal/WithdrawalSuccess.d.ts +0 -1
- package/dist/modals/WithdrawalModal/useWithdrawal.d.ts +1 -2
- package/dist/providers/FunkitCheckoutContext/index.d.ts +8 -0
- package/dist/providers/FunkitCheckoutContext/types.d.ts +6 -0
- package/dist/providers/FunkitConfigContext.d.ts +2 -0
- package/dist/wagmi/actions.d.ts +1 -1
- package/dist/wallets/walletConnectors/bifrostWallet/bifrostWallet.js +2 -2
- package/dist/wallets/walletConnectors/bitgetWallet/bitgetWallet.js +2 -2
- package/dist/wallets/walletConnectors/bybitWallet/bybitWallet.js +2 -2
- package/dist/wallets/walletConnectors/clvWallet/clvWallet.js +2 -2
- package/dist/wallets/walletConnectors/coin98Wallet/coin98Wallet.js +2 -2
- package/dist/wallets/walletConnectors/coreWallet/coreWallet.js +2 -2
- package/dist/wallets/walletConnectors/foxWallet/foxWallet.js +2 -2
- package/dist/wallets/walletConnectors/frontierWallet/frontierWallet.js +2 -2
- package/dist/wallets/walletConnectors/gateWallet/gateWallet.js +2 -2
- package/dist/wallets/walletConnectors/index.js +40 -40
- package/dist/wallets/walletConnectors/metaMaskWallet/metaMaskWallet.js +2 -2
- package/dist/wallets/walletConnectors/okxWallet/okxWallet.js +2 -2
- package/dist/wallets/walletConnectors/rainbowWallet/rainbowWallet.js +2 -2
- package/dist/wallets/walletConnectors/roninWallet/roninWallet.js +2 -2
- package/dist/wallets/walletConnectors/safepalWallet/safepalWallet.js +2 -2
- package/dist/wallets/walletConnectors/subWallet/subWallet.js +2 -2
- package/dist/wallets/walletConnectors/tokenPocketWallet/tokenPocketWallet.js +2 -2
- package/dist/wallets/walletConnectors/trustWallet/trustWallet.js +2 -2
- package/dist/wallets/walletConnectors/zerionWallet/zerionWallet.js +2 -2
- package/package.json +10 -5
- package/dist/wallets/walletConnectors/{chunk-VMMROPXK.js → chunk-34HACM5U.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-3ZJN3PXP.js → chunk-5TN5Z2WY.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-OD6B2ISG.js → chunk-6DRCY52E.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-IRHK6SOW.js → chunk-7V33VJAL.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-ZJJWGKB6.js → chunk-APHCF4DT.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-7IEUTLHY.js → chunk-DEFRRPXB.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-OSOB6QYX.js → chunk-FG2LDVXL.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-ZL6XCMV5.js → chunk-HRDPUW3V.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-UYW6MV74.js → chunk-HXWUH73P.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-UFYNHHDU.js → chunk-KWX2SYU2.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-AZYMJ4C6.js → chunk-LCIPVVH5.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-FWM4KTOV.js → chunk-T4ROGPMF.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-J3PJOMO7.js → chunk-UDTBQV4Q.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-55VS2NKG.js → chunk-V6UOWTEZ.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-LEAZMT5Y.js → chunk-VJZWNQOF.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-RZQ4B4Z7.js → chunk-XVBSJCW5.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-IMNI4AGV.js → chunk-YIEASHLS.js} +3 -3
- package/dist/wallets/walletConnectors/{chunk-YGMU5VWD.js → chunk-ZPSPK6LH.js} +3 -3
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* {@link WalletWithdrawalConfig}.
|
|
17
17
|
*/
|
|
18
18
|
import { type Address, type PublicClient, type TransactionReceipt } from 'viem';
|
|
19
|
-
import type { CustomWithdrawalConfig, FunkitWithdrawalConfig, WalletWithdrawalConfig } from '../providers/FunkitCheckoutContext/types';
|
|
19
|
+
import type { CustomWithdrawalConfig, FunkitCheckoutActionParams, FunkitWithdrawalConfig, WalletWithdrawalConfig } from '../providers/FunkitCheckoutContext/types';
|
|
20
20
|
import type { WithdrawalTransaction } from '../wallets/Wallet';
|
|
21
21
|
export interface PolymarketWithdrawalCallbackConfig {
|
|
22
22
|
userId: string;
|
|
@@ -130,3 +130,32 @@ export declare function createPolymarketWithdrawalConfig(config: PolymarketWithd
|
|
|
130
130
|
* ```
|
|
131
131
|
*/
|
|
132
132
|
export declare function createPolymarketWithdrawalConfig(config: PolymarketWalletUnwrapWithdrawalConfig): WalletWithdrawalConfig;
|
|
133
|
+
export interface PolymarketPerpsDepositConfig {
|
|
134
|
+
/**
|
|
135
|
+
* Polymarket Perps account credited with the deposit
|
|
136
|
+
*/
|
|
137
|
+
recipientAddress: Address;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Builds the `generateActionsParams` callback for a Polymarket Perps deposit.
|
|
141
|
+
*
|
|
142
|
+
* Both legs run inside a single Relay Router V3 `cleanupErc20sViaCall` sweep,
|
|
143
|
+
* each mediated by the VaultDepositor proxy so the flow composes with
|
|
144
|
+
* EXACT_INPUT quoting — the VaultDepositor pulls msg.sender's full balance and
|
|
145
|
+
* substitutes AMOUNT_PLACEHOLDER at exec time, so arrival amounts don't need to
|
|
146
|
+
* be known at quote time:
|
|
147
|
+
* 1. USDC.e → pUSD via `CollateralOnramp.wrap`, attributing pUSD to Relay
|
|
148
|
+
* Router V3.
|
|
149
|
+
* 2. pUSD → `POLYMARKET_PERPS_ADDRESS.deposit`, crediting `recipientAddress`.
|
|
150
|
+
*
|
|
151
|
+
* Usage:
|
|
152
|
+
* ```ts
|
|
153
|
+
* const checkoutConfig: FunkitCheckoutConfig = {
|
|
154
|
+
* // ...
|
|
155
|
+
* generateActionsParams: createPerpsGenerateActionParams({
|
|
156
|
+
* recipientAddress: proxyAddress,
|
|
157
|
+
* }),
|
|
158
|
+
* }
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
export declare function createPerpsGenerateActionParams(config: PolymarketPerpsDepositConfig): () => Promise<FunkitCheckoutActionParams[]>;
|
|
@@ -11,10 +11,16 @@ import {
|
|
|
11
11
|
import {
|
|
12
12
|
encodeFunctionData,
|
|
13
13
|
erc20Abi,
|
|
14
|
-
getAddress
|
|
14
|
+
getAddress as getAddress2
|
|
15
15
|
} from "viem";
|
|
16
16
|
import { polygon } from "viem/chains";
|
|
17
17
|
|
|
18
|
+
// src/consts/polymarket.ts
|
|
19
|
+
import { getAddress } from "viem";
|
|
20
|
+
var POLYMARKET_PUSD_ADDRESS = getAddress(
|
|
21
|
+
"0xC011a7E12a19f7B1f670d46F03B03f3342E82DFB"
|
|
22
|
+
);
|
|
23
|
+
|
|
18
24
|
// src/domains/paymentMethods.ts
|
|
19
25
|
import { exhaustiveCheck, formatAddress } from "@funkit/utils";
|
|
20
26
|
|
|
@@ -286,6 +292,12 @@ function createPaymentMethodInfo(params) {
|
|
|
286
292
|
title: "QR Code Transfer",
|
|
287
293
|
description: ""
|
|
288
294
|
};
|
|
295
|
+
case "bitcoin_lightning" /* BITCOIN_LIGHTNING */:
|
|
296
|
+
return {
|
|
297
|
+
paymentMethod: "bitcoin_lightning" /* BITCOIN_LIGHTNING */,
|
|
298
|
+
title: "Bitcoin on Cash App",
|
|
299
|
+
description: ""
|
|
300
|
+
};
|
|
289
301
|
case "virtual_bank" /* VIRTUAL_BANK */:
|
|
290
302
|
return {
|
|
291
303
|
paymentMethod: "virtual_bank" /* VIRTUAL_BANK */,
|
|
@@ -346,7 +358,9 @@ var STATSIG_CLIENT_KEY = "client-UmFd8WIJljA7cLmZuDqs3X25M8sKd5WIQP4BSC2bRbM";
|
|
|
346
358
|
var default_feature_gates_default = {
|
|
347
359
|
"compliance-review-blocker": false,
|
|
348
360
|
"enable-across-wallet-flow": false,
|
|
361
|
+
"enable-add-token-to-wallet": false,
|
|
349
362
|
"enable-empty-withdrawal-selection": false,
|
|
363
|
+
"enable-free-usdc-banner": false,
|
|
350
364
|
"enable-permit-toggle": false,
|
|
351
365
|
"enable-polymarket-wallet-withdrawal": false,
|
|
352
366
|
"enable-swapped-exchanges": false,
|
|
@@ -354,9 +368,8 @@ var default_feature_gates_default = {
|
|
|
354
368
|
"faster-notifications": false,
|
|
355
369
|
"new-token-transfer-config": false,
|
|
356
370
|
"new-withdrawal-config": false,
|
|
357
|
-
"polymarket-pusd-migration": false,
|
|
358
371
|
"saved-card-defaults-to-fiat-tab": false,
|
|
359
|
-
"test-
|
|
372
|
+
"test-feature-gate": false,
|
|
360
373
|
"wallet-flow-enable-exact-input-with-actions": false,
|
|
361
374
|
"you-receive-remove-swap-impact": false
|
|
362
375
|
};
|
|
@@ -375,7 +388,7 @@ function checkFeatureGate(name) {
|
|
|
375
388
|
var PMCT_WITHDRAW_ACTION_TYPE = "PMCT_WITHDRAW";
|
|
376
389
|
var POLYGON_USDCE = "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174";
|
|
377
390
|
var PUSD_TOKEN = {
|
|
378
|
-
address:
|
|
391
|
+
address: POLYMARKET_PUSD_ADDRESS,
|
|
379
392
|
symbol: "pUSD",
|
|
380
393
|
iconSrc: "https://sdk-cdn.fun.xyz/images/pusd.svg"
|
|
381
394
|
};
|
|
@@ -552,6 +565,142 @@ function createPolymarketWithdrawalConfig(config) {
|
|
|
552
565
|
}
|
|
553
566
|
return "sendPmctTransfer" in config ? buildUdaWithdrawalConfig(config) : buildWalletUnwrapWithdrawalConfig(config);
|
|
554
567
|
}
|
|
568
|
+
var COLLATERAL_ONRAMP_ADDRESS = "0x93070a847efEf7F70739046A929D47a521F5B8ee";
|
|
569
|
+
var COLLATERAL_ONRAMP_ABI = [
|
|
570
|
+
{
|
|
571
|
+
name: "wrap",
|
|
572
|
+
type: "function",
|
|
573
|
+
inputs: [
|
|
574
|
+
{ name: "_asset", type: "address" },
|
|
575
|
+
{ name: "_to", type: "address" },
|
|
576
|
+
{ name: "_amount", type: "uint256" }
|
|
577
|
+
],
|
|
578
|
+
outputs: [],
|
|
579
|
+
stateMutability: "nonpayable"
|
|
580
|
+
}
|
|
581
|
+
];
|
|
582
|
+
var POLYMARKET_PERPS_ADDRESS = "0xdca4af75705dbb50f62437045aff9921947917d2";
|
|
583
|
+
var POLYMARKET_PERPS_ABI = [
|
|
584
|
+
{
|
|
585
|
+
name: "deposit",
|
|
586
|
+
type: "function",
|
|
587
|
+
stateMutability: "nonpayable",
|
|
588
|
+
inputs: [
|
|
589
|
+
{ internalType: "address", name: "token", type: "address" },
|
|
590
|
+
{ internalType: "uint256", name: "amount", type: "uint256" },
|
|
591
|
+
{ internalType: "address", name: "to", type: "address" }
|
|
592
|
+
],
|
|
593
|
+
outputs: []
|
|
594
|
+
}
|
|
595
|
+
];
|
|
596
|
+
var VAULT_DEPOSITOR_POLYGON = getAddress2(
|
|
597
|
+
"0xC8A6871D4eC4DaE64f605db0f8a0B3D9ef928D64"
|
|
598
|
+
);
|
|
599
|
+
var VAULT_DEPOSITOR_ABI = [
|
|
600
|
+
{
|
|
601
|
+
name: "deposit",
|
|
602
|
+
type: "function",
|
|
603
|
+
stateMutability: "nonpayable",
|
|
604
|
+
inputs: [
|
|
605
|
+
{ name: "token", type: "address" },
|
|
606
|
+
{ name: "vault", type: "address" },
|
|
607
|
+
{ name: "callData", type: "bytes" },
|
|
608
|
+
{ name: "minAmountOut", type: "uint256" }
|
|
609
|
+
],
|
|
610
|
+
outputs: [{ name: "returnData", type: "bytes" }]
|
|
611
|
+
}
|
|
612
|
+
];
|
|
613
|
+
var RELAY_ROUTER_V3_ADDRESS = getAddress2(
|
|
614
|
+
"0xb92fe925DC43a0ECdE6c8b1a2709c170Ec4fFf4f"
|
|
615
|
+
);
|
|
616
|
+
var RELAY_ROUTER_V3_ABI = [
|
|
617
|
+
{
|
|
618
|
+
inputs: [
|
|
619
|
+
{ internalType: "address[]", name: "tokens", type: "address[]" },
|
|
620
|
+
{ internalType: "address[]", name: "tos", type: "address[]" },
|
|
621
|
+
{ internalType: "bytes[]", name: "datas", type: "bytes[]" },
|
|
622
|
+
{ internalType: "uint256[]", name: "amounts", type: "uint256[]" }
|
|
623
|
+
],
|
|
624
|
+
name: "cleanupErc20sViaCall",
|
|
625
|
+
outputs: [],
|
|
626
|
+
stateMutability: "nonpayable",
|
|
627
|
+
type: "function"
|
|
628
|
+
}
|
|
629
|
+
];
|
|
630
|
+
var AMOUNT_PLACEHOLDER = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffdeadbeefn;
|
|
631
|
+
function createPerpsGenerateActionParams(config) {
|
|
632
|
+
const { recipientAddress } = config;
|
|
633
|
+
return async () => {
|
|
634
|
+
const wrapUsdceToPusd = encodeFunctionData({
|
|
635
|
+
abi: COLLATERAL_ONRAMP_ABI,
|
|
636
|
+
functionName: "wrap",
|
|
637
|
+
args: [POLYGON_USDCE, RELAY_ROUTER_V3_ADDRESS, AMOUNT_PLACEHOLDER]
|
|
638
|
+
});
|
|
639
|
+
const wrapUsdceToPusdViaVaultDepositor = encodeFunctionData({
|
|
640
|
+
abi: VAULT_DEPOSITOR_ABI,
|
|
641
|
+
functionName: "deposit",
|
|
642
|
+
args: [POLYGON_USDCE, COLLATERAL_ONRAMP_ADDRESS, wrapUsdceToPusd, 0n]
|
|
643
|
+
});
|
|
644
|
+
const depositPusdToPerps = encodeFunctionData({
|
|
645
|
+
abi: POLYMARKET_PERPS_ABI,
|
|
646
|
+
functionName: "deposit",
|
|
647
|
+
args: [PUSD_TOKEN.address, AMOUNT_PLACEHOLDER, recipientAddress]
|
|
648
|
+
});
|
|
649
|
+
const depositPusdToPerpsViaVaultDepositor = encodeFunctionData({
|
|
650
|
+
abi: VAULT_DEPOSITOR_ABI,
|
|
651
|
+
functionName: "deposit",
|
|
652
|
+
args: [
|
|
653
|
+
PUSD_TOKEN.address,
|
|
654
|
+
POLYMARKET_PERPS_ADDRESS,
|
|
655
|
+
depositPusdToPerps,
|
|
656
|
+
0n
|
|
657
|
+
]
|
|
658
|
+
});
|
|
659
|
+
const legs = [
|
|
660
|
+
// Leg 1 — sweep the bridged USDC.e and wrap it into pUSD.
|
|
661
|
+
{
|
|
662
|
+
token: POLYGON_USDCE,
|
|
663
|
+
to: VAULT_DEPOSITOR_POLYGON,
|
|
664
|
+
data: wrapUsdceToPusdViaVaultDepositor,
|
|
665
|
+
// relay replaces this with the actual amount of tokens available at execution time https://github.com/relayprotocol/relay-periphery/blob/0e4aabb750efb1f807d7f12b83b090b51b9ee736/src/v3/RelayRouterV3.sol#L177-L180
|
|
666
|
+
amount: 0n
|
|
667
|
+
},
|
|
668
|
+
// Leg 2 — sweep the resulting pUSD and deposit it into Polymarket Perps
|
|
669
|
+
// for the recipient.
|
|
670
|
+
{
|
|
671
|
+
token: PUSD_TOKEN.address,
|
|
672
|
+
to: VAULT_DEPOSITOR_POLYGON,
|
|
673
|
+
data: depositPusdToPerpsViaVaultDepositor,
|
|
674
|
+
// relay replaces this with the actual amount of tokens available at execution time https://github.com/relayprotocol/relay-periphery/blob/0e4aabb750efb1f807d7f12b83b090b51b9ee736/src/v3/RelayRouterV3.sol#L177-L180
|
|
675
|
+
amount: 0n
|
|
676
|
+
}
|
|
677
|
+
];
|
|
678
|
+
return [
|
|
679
|
+
// RelayRouterV3 calls its function `cleanupErc20sViaCall`
|
|
680
|
+
// that iterates over the legs and does the following for each leg:
|
|
681
|
+
// 1. Substitutes 0n with the actual amount of tokens available at execution time (https://github.com/relayprotocol/relay-periphery/blob/0e4aabb750efb1f807d7f12b83b090b51b9ee736/src/v3/RelayRouterV3.sol#L177-L180):
|
|
682
|
+
// `IERC20(token).balanceOf(address(this))`
|
|
683
|
+
// 2. Approves the token to the target address (https://github.com/relayprotocol/relay-periphery/blob/0e4aabb750efb1f807d7f12b83b090b51b9ee736/src/v3/RelayRouterV3.sol#L183-L184):
|
|
684
|
+
// `IERC20(token).approve(to, amount)`
|
|
685
|
+
// 3. Makes the call to the target address and bubles up the revert if it fails (https://github.com/relayprotocol/relay-periphery/blob/0e4aabb750efb1f807d7f12b83b090b51b9ee736/src/v3/RelayRouterV3.sol#L186-L190):
|
|
686
|
+
// `(bool success, ) = to.call(data);
|
|
687
|
+
// `if (!success) { revert CallFailed(); }`
|
|
688
|
+
{
|
|
689
|
+
contractAbi: RELAY_ROUTER_V3_ABI,
|
|
690
|
+
contractAddress: RELAY_ROUTER_V3_ADDRESS,
|
|
691
|
+
functionName: "cleanupErc20sViaCall",
|
|
692
|
+
// cleanupErc20sViaCall takes parallel arrays — transpose the per-leg rows.
|
|
693
|
+
functionArgs: [
|
|
694
|
+
legs.map((leg) => leg.token),
|
|
695
|
+
legs.map((leg) => leg.to),
|
|
696
|
+
legs.map((leg) => leg.data),
|
|
697
|
+
legs.map((leg) => leg.amount)
|
|
698
|
+
]
|
|
699
|
+
}
|
|
700
|
+
];
|
|
701
|
+
};
|
|
702
|
+
}
|
|
555
703
|
export {
|
|
704
|
+
createPerpsGenerateActionParams,
|
|
556
705
|
createPolymarketWithdrawalConfig
|
|
557
706
|
};
|
|
@@ -6,6 +6,7 @@ export declare const copyButtonIconActive: string;
|
|
|
6
6
|
export declare const copyInputTextBox: string;
|
|
7
7
|
export declare const copyInputTextBoxActive: string;
|
|
8
8
|
export declare const copyInputText: string;
|
|
9
|
+
export declare const displayedAddressText: string;
|
|
9
10
|
export declare const copyInputTextWrapper: string;
|
|
10
11
|
export declare const copyInputTextDefault: string;
|
|
11
12
|
export declare const copyInputTextActive: string;
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
type CopyLabel = 'address' | 'invoice';
|
|
2
3
|
interface CopyInputDisplayedAddressProps {
|
|
3
4
|
address: string;
|
|
4
5
|
onAddressCopied?: () => void;
|
|
5
6
|
truncateAddress?: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Word rendered after "Copy" in the button label. EN variant char-animates
|
|
9
|
+
* the raw word; i18n variant maps to `common.copyAddress` / `common.copyInvoice`.
|
|
10
|
+
*/
|
|
11
|
+
label?: CopyLabel;
|
|
6
12
|
}
|
|
7
13
|
/**
|
|
8
14
|
* Main exported component that conditionally renders English or i18n version
|
|
@@ -2,6 +2,7 @@ import { type SwappedFormOfPayment } from '@funkit/api-base';
|
|
|
2
2
|
import React, { type ReactNode } from 'react';
|
|
3
3
|
import { type FunkitPaymentMethodIconsConfig } from '../../providers/FunkitConfigContext';
|
|
4
4
|
import { PaymentMethod, type PaymentMethodBrokerageInfo, type PaymentMethodVirtualBankInfo } from '../../domains/paymentMethods';
|
|
5
|
+
import type { AssetHoldingsItem } from '../../domains/wallet';
|
|
5
6
|
/**
|
|
6
7
|
* Get a custom icon passed in from UI customization config
|
|
7
8
|
* These icons are passed in from client to support enhanced branding+design
|
|
@@ -38,6 +39,7 @@ interface ConnectedPaymentMethodItemProps {
|
|
|
38
39
|
disabled?: boolean;
|
|
39
40
|
}
|
|
40
41
|
export declare const AccountBalancePaymentMethodItem: ({ isSelected, showSelectedCheckmark, onSelect, targetChainId, testId, disabled, }: ConnectedPaymentMethodItemProps) => React.JSX.Element;
|
|
42
|
+
export declare const BitcoinLightningPaymentMethodItem: ({ isActive, onClick, isClickable, customValueIcon, paymentIcon, }: PaymentMethodItemProps) => React.JSX.Element;
|
|
41
43
|
export declare const ActiveFiatAccountPaymentMethodItem: ({ isActive, onClick, paymentMethodInfo, customValueIcon, testId, disabled, }: BasePaymentMethodItemProps & {
|
|
42
44
|
paymentMethodInfo: PaymentMethodVirtualBankInfo;
|
|
43
45
|
testId?: string;
|
|
@@ -50,10 +52,24 @@ type BasePaymentMethodItemProps = {
|
|
|
50
52
|
customValueIcon?: ReactNode;
|
|
51
53
|
testId?: string;
|
|
52
54
|
};
|
|
55
|
+
type PaymentMethodItemProps = BasePaymentMethodItemProps & {
|
|
56
|
+
paymentIcon: ReactNode;
|
|
57
|
+
};
|
|
53
58
|
export declare function AddPaymentMethodItem({ paymentMethod, isClickable, isActive, onClick, customValueIcon, testId, }: BasePaymentMethodItemProps & {
|
|
54
59
|
paymentMethod: PaymentMethod;
|
|
55
60
|
dynamicLimit?: string;
|
|
56
61
|
}): React.JSX.Element | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Source-list row for the underlying asset a customer is supplying
|
|
64
|
+
* (e.g. USDT for an Aave aUSDT checkout) when the user already holds
|
|
65
|
+
* it. Click pre-selects the asset as the source and skips
|
|
66
|
+
* asset-select via SourceChange's `skipAssetSelect` routing.
|
|
67
|
+
*/
|
|
68
|
+
export declare function NativeAssetItem({ asset, label, onClick, }: {
|
|
69
|
+
asset: AssetHoldingsItem;
|
|
70
|
+
label: string;
|
|
71
|
+
onClick: () => void;
|
|
72
|
+
}): React.JSX.Element;
|
|
57
73
|
export declare function PayPalPaymentMethodItem({ isActive, isClickable, onClick, isLoading, }: BasePaymentMethodItemProps & {
|
|
58
74
|
isLoading: boolean;
|
|
59
75
|
}): React.JSX.Element;
|
|
@@ -12,5 +12,13 @@ export declare function isAvantisCustomer(apiKey: string): apiKey is "6TUi99Tq3O
|
|
|
12
12
|
export declare function isPerplCustomer(apiKey: string): apiKey is "wQDLu86Qab61vbtru7thf8Yj0xaeqVUH4ohoXESu";
|
|
13
13
|
export declare function isLighterxyzCustomer(apiKey: string): apiKey is "i6e1I8cfX625TTwRJlD2DshKyAoaUtO8aeoaR4i2";
|
|
14
14
|
export declare function isFanaticsCustomer(apiKey: string): apiKey is "lI7amueGK94QtGa7sGGVf8n0XhIcn4sHFAZRu5Jj";
|
|
15
|
+
export declare function isAaveCustomer(apiKey: string): apiKey is "EWzSv8tWnQ7UcZ2IsDqFw1dYo3Df56FX6KBJ5ztS";
|
|
16
|
+
/**
|
|
17
|
+
* Gates the source-select "Native" fast-path: when the connected wallet
|
|
18
|
+
* already holds `checkoutConfig.targetAsset`, surface a one-click row
|
|
19
|
+
* that skips asset-select and lands on InputAmount. Currently Aave-only;
|
|
20
|
+
* extend by OR-ing additional `is<Customer>Customer` predicates.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isCustomerNativeFastPathEnabled(apiKey: string): apiKey is "EWzSv8tWnQ7UcZ2IsDqFw1dYo3Df56FX6KBJ5ztS";
|
|
15
23
|
export declare function isLighterEthSpot(apiKey: string, checkoutConfig: FunkitCheckoutConfig | undefined): boolean | undefined;
|
|
16
24
|
export declare function isLighterSlowDeposit(apiKey: string, checkoutConfig: Pick<FunkitCheckoutConfig, 'targetChain'> | undefined): boolean;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Action type signalling a Polymarket Perps deposit (USDC.e → pUSD → Perps). */
|
|
2
|
+
export declare const POLYMARKET_PERPS_DEPOSIT_ACTION_TYPE = "POLYMARKET_PERPS_DEPOSIT";
|
|
3
|
+
/**
|
|
4
|
+
* Polymarket pUSD on Polygon. Perps deposits must land in pUSD on-chain, so
|
|
5
|
+
* QR/UDA transfers for the deposit action target this address.
|
|
6
|
+
*/
|
|
7
|
+
export declare const POLYMARKET_PUSD_ADDRESS: `0x${string}`;
|
|
@@ -9,6 +9,7 @@ export declare enum PaymentMethod {
|
|
|
9
9
|
/** Bluvo - Exchange / Brokerage **/
|
|
10
10
|
BROKERAGE = "brokerage",
|
|
11
11
|
TOKEN_TRANSFER = "token_transfer",
|
|
12
|
+
BITCOIN_LIGHTNING = "bitcoin_lightning",
|
|
12
13
|
VIRTUAL_BANK = "virtual_bank",
|
|
13
14
|
SWAPPED_CARD = "swapped_card",
|
|
14
15
|
SEPA = "sepa",
|
|
@@ -38,6 +39,9 @@ export interface PaymentMethodAccountInfo extends PaymentMethodInfoBase {
|
|
|
38
39
|
export interface PaymentMethodTokenTransferInfo extends PaymentMethodInfoBase {
|
|
39
40
|
paymentMethod: PaymentMethod.TOKEN_TRANSFER;
|
|
40
41
|
}
|
|
42
|
+
export interface PaymentMethodBitcoinLightningInfo extends PaymentMethodInfoBase {
|
|
43
|
+
paymentMethod: PaymentMethod.BITCOIN_LIGHTNING;
|
|
44
|
+
}
|
|
41
45
|
export interface PaymentMethodVirtualBankIncompleteInfo extends PaymentMethodInfoBase {
|
|
42
46
|
paymentMethod: PaymentMethod.VIRTUAL_BANK;
|
|
43
47
|
matchingFiatAccount: BridgeVirtualBankAccount | undefined;
|
|
@@ -48,7 +52,7 @@ export interface PaymentMethodVirtualBankInfo extends PaymentMethodVirtualBankIn
|
|
|
48
52
|
}
|
|
49
53
|
export type ConnectablePaymentMethodInfo = PaymentMethodAccountInfo | PaymentMethodBrokerageInfo | PaymentMethodVirtualBankInfo;
|
|
50
54
|
export declare function isConnectablePaymentMethodInfo(value: unknown): value is ConnectablePaymentMethodInfo;
|
|
51
|
-
export type PaymentMethodInfo = PaymentMethodCardInfo | PaymentMethodBrokerageInfo | PaymentMethodAccountInfo | PaymentMethodTokenTransferInfo | PaymentMethodVirtualBankIncompleteInfo;
|
|
55
|
+
export type PaymentMethodInfo = PaymentMethodCardInfo | PaymentMethodBrokerageInfo | PaymentMethodAccountInfo | PaymentMethodTokenTransferInfo | PaymentMethodBitcoinLightningInfo | PaymentMethodVirtualBankIncompleteInfo;
|
|
52
56
|
interface CardPaymentMethodParams {
|
|
53
57
|
paymentMethod: PaymentMethod.CARD;
|
|
54
58
|
/** We also store client's customization in our database :( */
|
|
@@ -66,6 +70,9 @@ interface BrokeragePaymentMethodParams {
|
|
|
66
70
|
interface TokenTransferPaymentMethodParams {
|
|
67
71
|
paymentMethod: PaymentMethod.TOKEN_TRANSFER;
|
|
68
72
|
}
|
|
73
|
+
interface BitcoinLightningPaymentMethodParams {
|
|
74
|
+
paymentMethod: PaymentMethod.BITCOIN_LIGHTNING;
|
|
75
|
+
}
|
|
69
76
|
interface VirtualBankPaymentMethodIncompleteParams {
|
|
70
77
|
paymentMethod: PaymentMethod.VIRTUAL_BANK;
|
|
71
78
|
matchingFiatAccount: undefined;
|
|
@@ -79,6 +86,7 @@ interface VirtualBankPaymentMethodParams {
|
|
|
79
86
|
export declare function createPaymentMethodInfo(params: CardPaymentMethodParams): PaymentMethodCardInfo;
|
|
80
87
|
export declare function createPaymentMethodInfo(params: AccountPaymentMethodParams): PaymentMethodAccountInfo;
|
|
81
88
|
export declare function createPaymentMethodInfo(params: TokenTransferPaymentMethodParams): PaymentMethodTokenTransferInfo;
|
|
89
|
+
export declare function createPaymentMethodInfo(params: BitcoinLightningPaymentMethodParams): PaymentMethodBitcoinLightningInfo;
|
|
82
90
|
export declare function createPaymentMethodInfo(params: VirtualBankPaymentMethodIncompleteParams): PaymentMethodVirtualBankIncompleteInfo;
|
|
83
91
|
export declare function createPaymentMethodInfo(params: VirtualBankPaymentMethodParams): PaymentMethodVirtualBankInfo;
|
|
84
92
|
export declare function createPaymentMethodInfo(params: BrokeragePaymentMethodParams): PaymentMethodBrokerageInfo;
|
package/dist/domains/quote.d.ts
CHANGED
|
@@ -22,6 +22,17 @@ export declare function getCheckoutBaseQuote(checkoutItem: FunkitActiveCheckoutI
|
|
|
22
22
|
* scoped to Wallet (Relay direct-execution) only.
|
|
23
23
|
*/
|
|
24
24
|
usePermit?: boolean): Promise<CheckoutQuoteResponse>;
|
|
25
|
+
/**
|
|
26
|
+
* In EXACT_IN/ONE_TO_ONE mode, the user's input is the source (from) amount.
|
|
27
|
+
* When a canonical bigint is available, use formatUnits to produce the precise
|
|
28
|
+
* human-readable string, avoiding precision loss from bigint->Number->string.
|
|
29
|
+
*/
|
|
30
|
+
export declare function resolveFromTokenAmount(checkoutItem: FunkitActiveCheckoutItem, isExactInViaBuilder: boolean, userInputAmount: number, fromTokenDecimals: number): string;
|
|
31
|
+
/**
|
|
32
|
+
* Derives estSubtotalToAmount from metadata.toAmountBaseUnit for EXACT_IN quotes.
|
|
33
|
+
* Returns null when derivation isn't needed or isn't possible.
|
|
34
|
+
**/
|
|
35
|
+
export declare function deriveEstSubtotalToAmountIfNeeded(baseQuote: CheckoutQuoteResponse, isExactIn: boolean, toTokenDecimals: number): string | null;
|
|
25
36
|
export declare function getQuoteFinalEstimation(baseQuote: CheckoutQuoteResponse, checkoutItem: FunkitActiveCheckoutItem, newPaymentMethodInfo: PaymentMethodInfo, wagmiConfig: Config, apiKey: string, loginType: LoginType, isWithdrawal?: boolean, brokerageQuote?: BluvoBrokerageQuote): Promise<{
|
|
26
37
|
finalEstimation: FunkitCheckoutQuoteResult;
|
|
27
38
|
brokerage?: BrokerageDetails;
|
|
@@ -5,6 +5,7 @@ export declare function usePaymentMethodEnablement(): {
|
|
|
5
5
|
isTokenTransferEnabled: boolean;
|
|
6
6
|
isMeldEnabled: boolean;
|
|
7
7
|
isBrokerageEnabled: boolean;
|
|
8
|
+
isLightningEnabled: boolean;
|
|
8
9
|
};
|
|
9
10
|
export type PaymentMethodType = 'crypto' | 'fiat';
|
|
10
11
|
export type UnavailablePaymentSource = {
|
package/dist/index.css
CHANGED
|
@@ -15203,6 +15203,14 @@
|
|
|
15203
15203
|
opacity: 0;
|
|
15204
15204
|
}
|
|
15205
15205
|
|
|
15206
|
+
/* vanilla-extract-css-ns:src/components/FunAssetAvatar/FunAssetAvatar.css.ts.vanilla.css?source=LnV3cmRjMjAgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoudXdyZGMyMiB7CiAgcG9zaXRpb246IGFic29sdXRlOwp9 */
|
|
15207
|
+
[data-rk] .uwrdc20 {
|
|
15208
|
+
position: relative;
|
|
15209
|
+
}
|
|
15210
|
+
[data-rk] .uwrdc22 {
|
|
15211
|
+
position: absolute;
|
|
15212
|
+
}
|
|
15213
|
+
|
|
15206
15214
|
/* vanilla-extract-css-ns:src/components/FunBadge/FunBadge.css.ts.vanilla.css?source=QGtleWZyYW1lcyBiYzJ1enkwIHsKICAwJSB7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTIwMCUpOwogIH0KICAzNSUsIDEwMCUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDIwMCUpOwogIH0KfQouYmMydXp5MSB7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHdpZHRoOiBmaXQtY29udGVudDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5iYzJ1enkyIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQouYmMydXp5Mjo6YmVmb3JlIHsKICBjb250ZW50OiAiIjsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgaW5zZXQ6IDA7CiAgZGlzcGxheTogYmxvY2s7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgdHJhbnNwYXJlbnQgMzAlLCB3aGl0ZSA0NSUsIHdoaXRlIDU1JSwgdHJhbnNwYXJlbnQgNzAlKSBuby1yZXBlYXQ7CiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0yMDAlKTsKICBiYWNrZ3JvdW5kLXNpemU6IDIwMCUgMTAwJTsKICBvcGFjaXR5OiAwLjk7CiAgZmlsdGVyOiBibHVyKDJweCk7CiAgYW5pbWF0aW9uOiBiYzJ1enkwIDVzIGxpbmVhciBpbmZpbml0ZSAxczsKICBtaXgtYmxlbmQtbW9kZTogc29mdC1saWdodDsKfQ== */
|
|
15207
15215
|
@keyframes bc2uzy0 {
|
|
15208
15216
|
0% {
|
|
@@ -15501,14 +15509,6 @@
|
|
|
15501
15509
|
flex: 1;
|
|
15502
15510
|
}
|
|
15503
15511
|
|
|
15504
|
-
/* vanilla-extract-css-ns:src/components/FunAssetAvatar/FunAssetAvatar.css.ts.vanilla.css?source=LnV3cmRjMjAgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoudXdyZGMyMiB7CiAgcG9zaXRpb246IGFic29sdXRlOwp9 */
|
|
15505
|
-
[data-rk] .uwrdc20 {
|
|
15506
|
-
position: relative;
|
|
15507
|
-
}
|
|
15508
|
-
[data-rk] .uwrdc22 {
|
|
15509
|
-
position: absolute;
|
|
15510
|
-
}
|
|
15511
|
-
|
|
15512
15512
|
/* vanilla-extract-css-ns:src/components/FunCountdown/FunCountdown.css.ts.vanilla.css?source=Ll8xdDBiYzExMSB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDA7CiAgdG9wOiAwOwogIGJvdHRvbTogMDsKICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpOwp9Ci5fMXQwYmMxMTMgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAwOwogIHRvcDogMDsKICBib3R0b206IDA7CiAgdHJhbnNmb3JtOiByb3RhdGUoLTkwZGVnKTsKfQ== */
|
|
15513
15513
|
[data-rk] ._1t0bc111 {
|
|
15514
15514
|
position: absolute;
|
|
@@ -15620,8 +15620,8 @@
|
|
|
15620
15620
|
inset: 0;
|
|
15621
15621
|
}
|
|
15622
15622
|
|
|
15623
|
-
/* vanilla-extract-css-ns:src/components/CopyAddress/CopyInputDisplayedAddress.css.ts.vanilla.css?source=#
|
|
15624
|
-
@keyframes
|
|
15623
|
+
/* vanilla-extract-css-ns:src/components/CopyAddress/CopyInputDisplayedAddress.css.ts.vanilla.css?source=#H4sIAAAAAAAAA81W247bNhB9368YBFjABkSBsiMnq7wEST8i7UtBUSObME0KJL22U+y/F6QuFiXHcVOgKAyY4m3mzJnhIT/v8VIbdkALf2b78juKlxr+egKgz6EBcIYpW2tzINqIrVAF5PQZ6POneLZoPyVz+PuCLsFoxxx+W9AKt0uwnElcZMt2k24YF+5SQOb7b08AWd67m89t6GyOpu9bS7WQDk0BpTyaxao5LweD9F8FsKHP1xDIehxEuplGQW9g2QxY3p4+zznedhwno8hv4/SB3ENKIqiPIPX0fJxzmj1M3c8g/cPsvz2lPS3r4FcfnRQKCddSmwJemVkQYvZt3xLGndDqq+/8JiwrJVbBcqlNhYaU2jl9IBJrRwyrxNEWwJnki8GOHxWEa6WQuy9H57RaAoGsS1lsx4jt7hcNBUqEB1sAkxKynB4s8GMpOCnxu0CzoOk6AZoATekmAc/QiI33gQ1C+A75ngiuFalQsksBaZbbT7M5ZndE17VFV/gczRa0c70NGiw0ukdoUDInXtGPnkTldgVkm+bsuzv0JFz7lbBNsLE1ogpWJONIhMOD5wiVQxNHUhQl1tpgiIhr5VC5At69iyGw0mp5dAGC000Bq9afz+XQ6bC9xNC6bpe7Pl2rfvRM7I5V+lSAUBYd0PDL0rw5Az8ag8qFgpqmbShwSFe5TVrn3XfruutEjsNYbKpnva2daUYn5UKcOAi1JfVR8RbHpGhWeSiZUDg5TSBLKV1OGWe1Q/M44aYlcqDMV/9/RzqXoiEN804aLS9brbyE+qMR5Khv/V/ijXTtpjkn/g824zMXKdaw72e57XTpf5C8PGRtJK4jPY+WecLCWuuM3mOQgF4B5mCv+hDYDLhHG5kxPsiMtmQnvYZ0S7oSWKX5lMiZc0jXM537QdQP0TwWrpiCzQ2JHMvg6oYMRvp3RyDTlY19RSLWS+Tal3MkksPI5Fx8aEdv3ZkLkn7IfSm37XLq93qUZ0XRkji+4UdbP1733Cz62WU0ShKdJWkC+o/FpGxfpgiHpd8WK9qcl3f2srD39m00XDdChXdBLfEcbS7D5mFZKTXfj6+x7vCfdsIhsQ3jWIDSJ8OawN0rmlp6mdqJqkIV4sWzI9cJlFI0VsT1wO9AbtDYBrnvBv+T1BPrLhILaAxaNK9I1lVkuooD6uIe4mJKHFg4MYodsD8w8WgCSitcxsujAzYZToDa6fKjYW1stBfF6+QvytzYRC2kJAddYQG1NidmKhsV8xRnNzF7KOEPC++R9/H9R+6d1wm9vk3oY7hD0f8NJKC0rHMNAAA= */
|
|
15624
|
+
@keyframes _1kbzei9f {
|
|
15625
15625
|
0% {
|
|
15626
15626
|
transform-origin: 50% 0%;
|
|
15627
15627
|
transform: translateY(0) rotateX(0deg) scale(1);
|
|
@@ -15641,7 +15641,7 @@
|
|
|
15641
15641
|
filter: blur(6px);
|
|
15642
15642
|
}
|
|
15643
15643
|
}
|
|
15644
|
-
@keyframes
|
|
15644
|
+
@keyframes _1kbzei9g {
|
|
15645
15645
|
0%, 15% {
|
|
15646
15646
|
transform-origin: 50% 100%;
|
|
15647
15647
|
transform: translateY(-60%) rotateX(30deg) scale(.6);
|
|
@@ -15658,8 +15658,8 @@
|
|
|
15658
15658
|
}
|
|
15659
15659
|
[data-rk] ._1kbzei93 {
|
|
15660
15660
|
outline-color: var(--rk-colors-actionColorDisabled);
|
|
15661
|
-
border-bottom-left-radius: var(--rk-radii-connectButton);
|
|
15662
|
-
border-bottom-right-radius: var(--rk-radii-connectButton);
|
|
15661
|
+
border-bottom-left-radius: calc(var(--rk-radii-connectButton) - 1px);
|
|
15662
|
+
border-bottom-right-radius: calc(var(--rk-radii-connectButton) - 1px);
|
|
15663
15663
|
transition: all 150ms cubic-bezier(0.3, 0, 0.06, 1);
|
|
15664
15664
|
}
|
|
15665
15665
|
[data-rk] ._1kbzei94 {
|
|
@@ -15744,11 +15744,18 @@
|
|
|
15744
15744
|
display: inline-flex;
|
|
15745
15745
|
}
|
|
15746
15746
|
[data-rk] ._1kbzei9b {
|
|
15747
|
+
display: block;
|
|
15748
|
+
width: 100%;
|
|
15749
|
+
white-space: nowrap;
|
|
15750
|
+
overflow: hidden;
|
|
15751
|
+
text-overflow: ellipsis;
|
|
15752
|
+
}
|
|
15753
|
+
[data-rk] ._1kbzei9c {
|
|
15747
15754
|
position: relative;
|
|
15748
15755
|
perspective: 100px;
|
|
15749
15756
|
transform-style: preserve-3d;
|
|
15750
15757
|
}
|
|
15751
|
-
[data-rk] .
|
|
15758
|
+
[data-rk] ._1kbzei9d {
|
|
15752
15759
|
display: inline-block;
|
|
15753
15760
|
animation-name: var(--animation-name, none);
|
|
15754
15761
|
animation-delay: var(--animation-delay, 0s);
|
|
@@ -15757,7 +15764,7 @@
|
|
|
15757
15764
|
animation-fill-mode: forwards;
|
|
15758
15765
|
opacity: var(--animation-opacity, 1);
|
|
15759
15766
|
}
|
|
15760
|
-
[data-rk] .
|
|
15767
|
+
[data-rk] ._1kbzei9e {
|
|
15761
15768
|
transform: translateY(-60%) rotateX(30deg) scale(.6);
|
|
15762
15769
|
transform-origin: 50% 100%;
|
|
15763
15770
|
position: absolute;
|