btc-wallet 0.4.6-beta → 0.4.7-beta
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/core/btcUtils.d.ts +1 -0
- package/dist/index.js +208 -55
- package/dist/index.js.map +2 -2
- package/esm/index.js +208 -55
- package/esm/index.js.map +2 -2
- package/package.json +1 -1
package/esm/index.js
CHANGED
@@ -2627,35 +2627,107 @@ function createFloatingButtonWithIframe({
|
|
2627
2627
|
}) {
|
2628
2628
|
const button = document.createElement("img");
|
2629
2629
|
button.id = "satoshi-wallet-button";
|
2630
|
-
|
2630
|
+
const isIframeVisible = localStorage.getItem("btc-wallet-iframe-visible") === "true";
|
2631
|
+
button.src = isIframeVisible ? closeImageUrl : openImageUrl;
|
2632
|
+
iframe.style.display = isIframeVisible ? "block" : "none";
|
2633
|
+
const windowWidth = window.innerWidth;
|
2634
|
+
const windowHeight = window.innerHeight;
|
2635
|
+
const savedPosition = JSON.parse(
|
2636
|
+
localStorage.getItem("btc-wallet-button-position") || '{"right": "20px", "bottom": "20px"}'
|
2637
|
+
);
|
2638
|
+
const right = Math.min(Math.max(20, parseInt(savedPosition.right)), windowWidth - 80);
|
2639
|
+
const bottom = Math.min(Math.max(20, parseInt(savedPosition.bottom)), windowHeight - 80);
|
2631
2640
|
Object.assign(button.style, {
|
2632
2641
|
position: "fixed",
|
2633
|
-
bottom:
|
2634
|
-
right:
|
2642
|
+
bottom: `${bottom}px`,
|
2643
|
+
right: `${right}px`,
|
2635
2644
|
zIndex: "100000",
|
2636
2645
|
width: "60px",
|
2637
2646
|
height: "60px",
|
2638
2647
|
borderRadius: "50%",
|
2639
|
-
cursor: "
|
2640
|
-
transition: "transform 0.15s ease"
|
2648
|
+
cursor: "grab",
|
2649
|
+
transition: "transform 0.15s ease",
|
2650
|
+
userSelect: "none"
|
2641
2651
|
});
|
2642
2652
|
document.body.appendChild(button);
|
2643
|
-
|
2644
|
-
|
2645
|
-
|
2646
|
-
|
2653
|
+
let isDragging = false;
|
2654
|
+
let startX = 0;
|
2655
|
+
let startY = 0;
|
2656
|
+
let initialRight = 0;
|
2657
|
+
let initialBottom = 0;
|
2658
|
+
let dragStartTime = 0;
|
2659
|
+
button.addEventListener("mousedown", (e) => {
|
2660
|
+
isDragging = true;
|
2661
|
+
startX = e.clientX;
|
2662
|
+
startY = e.clientY;
|
2663
|
+
initialRight = parseInt(button.style.right);
|
2664
|
+
initialBottom = parseInt(button.style.bottom);
|
2665
|
+
dragStartTime = Date.now();
|
2666
|
+
button.style.cursor = "grabbing";
|
2667
|
+
button.style.transition = "none";
|
2668
|
+
e.preventDefault();
|
2669
|
+
});
|
2670
|
+
document.addEventListener("mousemove", (e) => {
|
2671
|
+
if (!isDragging)
|
2672
|
+
return;
|
2673
|
+
const deltaX = startX - e.clientX;
|
2674
|
+
const deltaY = startY - e.clientY;
|
2675
|
+
let newRight = initialRight + deltaX;
|
2676
|
+
let newBottom = initialBottom + deltaY;
|
2677
|
+
newRight = Math.min(Math.max(20, newRight), windowWidth - 80);
|
2678
|
+
newBottom = Math.min(Math.max(20, newBottom), windowHeight - 80);
|
2679
|
+
const snapThreshold = 20;
|
2680
|
+
const buttonLeft = windowWidth - newRight - 60;
|
2681
|
+
if (buttonLeft < snapThreshold) {
|
2682
|
+
newRight = windowWidth - 80;
|
2683
|
+
} else if (buttonLeft > windowWidth - snapThreshold - 60) {
|
2684
|
+
newRight = 20;
|
2685
|
+
}
|
2686
|
+
if (newBottom < snapThreshold) {
|
2687
|
+
newBottom = 20;
|
2688
|
+
} else if (newBottom > windowHeight - snapThreshold - 60) {
|
2689
|
+
newBottom = windowHeight - 80;
|
2690
|
+
}
|
2691
|
+
button.style.right = `${newRight}px`;
|
2692
|
+
button.style.bottom = `${newBottom}px`;
|
2693
|
+
updateIframePosition(iframe, newRight, newBottom, windowWidth, windowHeight);
|
2694
|
+
});
|
2695
|
+
document.addEventListener("mouseup", () => {
|
2696
|
+
if (!isDragging)
|
2697
|
+
return;
|
2698
|
+
const dragEndTime = Date.now();
|
2699
|
+
const isDragEvent = dragEndTime - dragStartTime > 200;
|
2700
|
+
isDragging = false;
|
2701
|
+
button.style.cursor = "grab";
|
2702
|
+
button.style.transition = "transform 0.15s ease";
|
2703
|
+
localStorage.setItem(
|
2704
|
+
"btc-wallet-button-position",
|
2705
|
+
JSON.stringify({
|
2706
|
+
right: button.style.right,
|
2707
|
+
bottom: button.style.bottom
|
2708
|
+
})
|
2709
|
+
);
|
2710
|
+
if (!isDragEvent) {
|
2711
|
+
handleButtonClick();
|
2712
|
+
}
|
2713
|
+
});
|
2714
|
+
const handleButtonClick = () => {
|
2647
2715
|
const isCurrentlyVisible = iframe.style.display === "block";
|
2648
2716
|
button.style.transform = "scale(0.8)";
|
2649
2717
|
setTimeout(() => {
|
2650
2718
|
button.style.transform = "scale(1)";
|
2651
2719
|
}, 150);
|
2652
|
-
|
2653
|
-
|
2654
|
-
|
2720
|
+
const newVisibleState = !isCurrentlyVisible;
|
2721
|
+
iframe.style.display = newVisibleState ? "block" : "none";
|
2722
|
+
button.src = newVisibleState ? closeImageUrl : openImageUrl;
|
2723
|
+
localStorage.setItem("btc-wallet-iframe-visible", String(newVisibleState));
|
2655
2724
|
setTimeout(() => {
|
2656
|
-
|
2725
|
+
if (newVisibleState) {
|
2726
|
+
iframe.focus();
|
2727
|
+
}
|
2657
2728
|
}, 0);
|
2658
2729
|
};
|
2730
|
+
button.onclick = null;
|
2659
2731
|
return button;
|
2660
2732
|
}
|
2661
2733
|
function createIframe({
|
@@ -2666,6 +2738,7 @@ function createIframe({
|
|
2666
2738
|
iframe.id = "satoshi-wallet-iframe";
|
2667
2739
|
iframe.allow = "clipboard-read; clipboard-write";
|
2668
2740
|
iframe.src = iframeUrl;
|
2741
|
+
const isVisible = localStorage.getItem("btc-wallet-iframe-visible") === "true";
|
2669
2742
|
Object.assign(iframe.style, __spreadValues({
|
2670
2743
|
position: "fixed",
|
2671
2744
|
bottom: "90px",
|
@@ -2673,7 +2746,7 @@ function createIframe({
|
|
2673
2746
|
zIndex: "100000",
|
2674
2747
|
boxShadow: "0 0 10px rgba(0, 0, 0, 0.1)",
|
2675
2748
|
borderRadius: "10px",
|
2676
|
-
display: "block",
|
2749
|
+
display: isVisible ? "block" : "none",
|
2677
2750
|
border: "none"
|
2678
2751
|
}, iframeStyle));
|
2679
2752
|
document.body.appendChild(iframe);
|
@@ -2731,6 +2804,20 @@ function removeWalletButton() {
|
|
2731
2804
|
const iframe = document.getElementById("satoshi-wallet-iframe");
|
2732
2805
|
iframe == null ? void 0 : iframe.remove();
|
2733
2806
|
}
|
2807
|
+
function updateIframePosition(iframe, buttonRight, buttonBottom, windowWidth, windowHeight) {
|
2808
|
+
const iframeWidth = parseInt(iframe.style.width);
|
2809
|
+
const iframeHeight = parseInt(iframe.style.height);
|
2810
|
+
let iframeRight = buttonRight;
|
2811
|
+
let iframeBottom = buttonBottom + 70;
|
2812
|
+
if (iframeRight + iframeWidth > windowWidth - 20) {
|
2813
|
+
iframeRight = Math.max(20, windowWidth - iframeWidth - 20);
|
2814
|
+
}
|
2815
|
+
if (iframeBottom + iframeHeight > windowHeight - 20) {
|
2816
|
+
iframeBottom = Math.max(20, buttonBottom - iframeHeight - 10);
|
2817
|
+
}
|
2818
|
+
iframe.style.right = `${iframeRight}px`;
|
2819
|
+
iframe.style.bottom = `${iframeBottom}px`;
|
2820
|
+
}
|
2734
2821
|
|
2735
2822
|
// src/utils/nearUtils.ts
|
2736
2823
|
import { providers } from "near-api-js";
|
@@ -3199,6 +3286,7 @@ import coinselect from "coinselect";
|
|
3199
3286
|
var NEAR_STORAGE_DEPOSIT_AMOUNT = "1250000000000000000000";
|
3200
3287
|
var NBTC_STORAGE_DEPOSIT_AMOUNT = "3000";
|
3201
3288
|
var GAS_LIMIT = "50000000000000";
|
3289
|
+
var NEW_ACCOUNT_MIN_DEPOSIT_AMOUNT = "1000";
|
3202
3290
|
function getBtcProvider() {
|
3203
3291
|
if (typeof window === "undefined" || !window.btcContext) {
|
3204
3292
|
throw new Error("BTC Provider is not initialized.");
|
@@ -3368,12 +3456,14 @@ function getDepositAmount(amount, option) {
|
|
3368
3456
|
} = yield nearCall(config.bridgeContractId, "get_config", {});
|
3369
3457
|
const depositAmount = Math.max(Number(min_deposit_amount), Number(amount));
|
3370
3458
|
const protocolFee = Math.max(Number(fee_min), Number(depositAmount) * fee_rate);
|
3371
|
-
const
|
3459
|
+
const newAccountMinDepositAmount = !(accountInfo == null ? void 0 : accountInfo.nonce) ? NEW_ACCOUNT_MIN_DEPOSIT_AMOUNT : 0;
|
3460
|
+
const totalDepositAmount = new Big(depositAmount).plus(protocolFee).plus(repayAmount).plus(newAccountMinDepositAmount).round(0, Big.roundDown).toNumber();
|
3372
3461
|
return {
|
3373
3462
|
depositAmount,
|
3374
3463
|
totalDepositAmount,
|
3375
3464
|
protocolFee,
|
3376
|
-
repayAmount
|
3465
|
+
repayAmount,
|
3466
|
+
newAccountMinDepositAmount
|
3377
3467
|
};
|
3378
3468
|
});
|
3379
3469
|
}
|
@@ -3500,6 +3590,14 @@ function checkSatoshiWhitelist(btcAccountId, env = "mainnet") {
|
|
3500
3590
|
return __async(this, null, function* () {
|
3501
3591
|
if (env !== "private_mainnet")
|
3502
3592
|
return;
|
3593
|
+
const hasShownNotice = localStorage.getItem("btc-wallet-private-mainnet-notice");
|
3594
|
+
if (!hasShownNotice) {
|
3595
|
+
Dialog.alert({
|
3596
|
+
title: "Notice",
|
3597
|
+
message: "You are currently using Satoshi Private Mainnet. This is a private version for testing. Please try a small amount of assets in Ramp"
|
3598
|
+
});
|
3599
|
+
localStorage.setItem("btc-wallet-private-mainnet-notice", "true");
|
3600
|
+
}
|
3503
3601
|
if (!btcAccountId)
|
3504
3602
|
return;
|
3505
3603
|
const config = yield getConfig(env);
|
@@ -3664,24 +3762,41 @@ function uint8ArrayToHex(uint8Array) {
|
|
3664
3762
|
|
3665
3763
|
// src/core/setupBTCWallet.ts
|
3666
3764
|
var { transfer, functionCall } = actionCreators;
|
3765
|
+
var STORAGE_KEYS = {
|
3766
|
+
ACCOUNT: "btc-wallet-account",
|
3767
|
+
PUBLIC_KEY: "btc-wallet-publickey",
|
3768
|
+
BTC_PUBLIC_KEY: "btc-wallet-btc-publickey"
|
3769
|
+
};
|
3667
3770
|
var state = {
|
3668
3771
|
saveAccount(account) {
|
3669
|
-
|
3772
|
+
if (!account) {
|
3773
|
+
this.removeAccount();
|
3774
|
+
return;
|
3775
|
+
}
|
3776
|
+
window.localStorage.setItem(STORAGE_KEYS.ACCOUNT, account);
|
3670
3777
|
},
|
3671
3778
|
removeAccount() {
|
3672
|
-
window.localStorage.removeItem(
|
3779
|
+
window.localStorage.removeItem(STORAGE_KEYS.ACCOUNT);
|
3673
3780
|
},
|
3674
3781
|
savePublicKey(publicKey) {
|
3675
|
-
|
3782
|
+
if (!publicKey) {
|
3783
|
+
this.removePublicKey();
|
3784
|
+
return;
|
3785
|
+
}
|
3786
|
+
window.localStorage.setItem(STORAGE_KEYS.PUBLIC_KEY, publicKey);
|
3676
3787
|
},
|
3677
3788
|
removePublicKey() {
|
3678
|
-
window.localStorage.removeItem(
|
3789
|
+
window.localStorage.removeItem(STORAGE_KEYS.PUBLIC_KEY);
|
3679
3790
|
},
|
3680
3791
|
saveBtcPublicKey(publicKey) {
|
3681
|
-
|
3792
|
+
if (!publicKey) {
|
3793
|
+
this.removeBtcPublicKey();
|
3794
|
+
return;
|
3795
|
+
}
|
3796
|
+
window.localStorage.setItem(STORAGE_KEYS.BTC_PUBLIC_KEY, publicKey);
|
3682
3797
|
},
|
3683
3798
|
removeBtcPublicKey() {
|
3684
|
-
window.localStorage.removeItem(
|
3799
|
+
window.localStorage.removeItem(STORAGE_KEYS.BTC_PUBLIC_KEY);
|
3685
3800
|
},
|
3686
3801
|
clear() {
|
3687
3802
|
this.removeAccount();
|
@@ -3689,17 +3804,39 @@ var state = {
|
|
3689
3804
|
this.removeBtcPublicKey();
|
3690
3805
|
},
|
3691
3806
|
save(account, publicKey) {
|
3807
|
+
if (!account || !publicKey) {
|
3808
|
+
this.clear();
|
3809
|
+
return;
|
3810
|
+
}
|
3692
3811
|
this.saveAccount(account);
|
3693
3812
|
this.savePublicKey(publicKey);
|
3694
3813
|
},
|
3695
3814
|
getAccount() {
|
3696
|
-
return window.localStorage.getItem(
|
3815
|
+
return window.localStorage.getItem(STORAGE_KEYS.ACCOUNT);
|
3697
3816
|
},
|
3698
3817
|
getPublicKey() {
|
3699
|
-
return window.localStorage.getItem(
|
3818
|
+
return window.localStorage.getItem(STORAGE_KEYS.PUBLIC_KEY);
|
3700
3819
|
},
|
3701
3820
|
getBtcPublicKey() {
|
3702
|
-
return window.localStorage.getItem(
|
3821
|
+
return window.localStorage.getItem(STORAGE_KEYS.BTC_PUBLIC_KEY);
|
3822
|
+
},
|
3823
|
+
isValid() {
|
3824
|
+
const account = this.getAccount();
|
3825
|
+
const publicKey = this.getPublicKey();
|
3826
|
+
const btcPublicKey = this.getBtcPublicKey();
|
3827
|
+
const allEmpty = !account && !publicKey && !btcPublicKey;
|
3828
|
+
const allExist = account && publicKey && btcPublicKey;
|
3829
|
+
return allEmpty || allExist;
|
3830
|
+
},
|
3831
|
+
syncSave(account, publicKey, btcPublicKey) {
|
3832
|
+
if (!account || !publicKey || !btcPublicKey) {
|
3833
|
+
this.clear();
|
3834
|
+
return;
|
3835
|
+
}
|
3836
|
+
this.clear();
|
3837
|
+
this.savePublicKey(publicKey);
|
3838
|
+
this.saveBtcPublicKey(btcPublicKey);
|
3839
|
+
this.saveAccount(account);
|
3703
3840
|
}
|
3704
3841
|
};
|
3705
3842
|
var BTCWallet = (_0) => __async(void 0, [_0], function* ({
|
@@ -3726,16 +3863,33 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
|
|
3726
3863
|
const currentConfig = walletConfig[env];
|
3727
3864
|
const walletNetwork = ["mainnet", "private_mainnet"].includes(env) ? "mainnet" : "testnet";
|
3728
3865
|
yield initBtcContext();
|
3866
|
+
function validateWalletState() {
|
3867
|
+
const accountId = state.getAccount();
|
3868
|
+
const publicKey = state.getPublicKey();
|
3869
|
+
const btcPublicKey = state.getBtcPublicKey();
|
3870
|
+
if (!accountId && publicKey || accountId && !publicKey || !publicKey && btcPublicKey) {
|
3871
|
+
state.clear();
|
3872
|
+
return false;
|
3873
|
+
}
|
3874
|
+
return true;
|
3875
|
+
}
|
3729
3876
|
function setupBtcContextListeners() {
|
3730
3877
|
return __async(this, null, function* () {
|
3731
3878
|
const handleConnectionUpdate = () => __async(this, null, function* () {
|
3732
3879
|
yield checkBtcNetwork(walletNetwork);
|
3733
|
-
|
3880
|
+
if (!state.isValid()) {
|
3881
|
+
state.clear();
|
3882
|
+
}
|
3883
|
+
validateWalletState();
|
3734
3884
|
const btcContext = window.btcContext;
|
3735
|
-
if (
|
3736
|
-
yield
|
3737
|
-
|
3738
|
-
|
3885
|
+
if (btcContext.account) {
|
3886
|
+
const btcPublicKey = yield btcContext.getPublicKey();
|
3887
|
+
if (btcPublicKey) {
|
3888
|
+
const { nearAddress, nearPublicKey } = yield getNearAccountByBtcPublicKey(btcPublicKey);
|
3889
|
+
yield checkSatoshiWhitelist(btcContext.account, env);
|
3890
|
+
removeWalletButton();
|
3891
|
+
setupWalletButton(env, wallet, btcContext);
|
3892
|
+
}
|
3739
3893
|
} else {
|
3740
3894
|
removeWalletButton();
|
3741
3895
|
setTimeout(() => {
|
@@ -3746,19 +3900,31 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
|
|
3746
3900
|
const context = window.btcContext.getContext();
|
3747
3901
|
context.on("updatePublicKey", (btcPublicKey) => __async(this, null, function* () {
|
3748
3902
|
console.log("updatePublicKey");
|
3749
|
-
|
3750
|
-
|
3751
|
-
|
3752
|
-
|
3753
|
-
|
3903
|
+
state.clear();
|
3904
|
+
try {
|
3905
|
+
const { nearAddress, nearPublicKey } = yield getNearAccountByBtcPublicKey(btcPublicKey);
|
3906
|
+
if (!nearAddress || !nearPublicKey) {
|
3907
|
+
throw new Error("Failed to get near account info");
|
3908
|
+
}
|
3909
|
+
emitter.emit("accountsChanged", {
|
3910
|
+
accounts: [{ accountId: nearAddress }]
|
3911
|
+
});
|
3912
|
+
yield handleConnectionUpdate();
|
3913
|
+
} catch (error) {
|
3914
|
+
console.error("Error updating public key:", error);
|
3915
|
+
state.clear();
|
3916
|
+
emitter.emit("accountsChanged", { accounts: [] });
|
3917
|
+
}
|
3754
3918
|
}));
|
3755
3919
|
context.on("btcLoginError", () => __async(this, null, function* () {
|
3756
3920
|
console.log("btcLoginError");
|
3921
|
+
state.clear();
|
3757
3922
|
emitter.emit("accountsChanged", { accounts: [] });
|
3758
3923
|
yield handleConnectionUpdate();
|
3759
3924
|
}));
|
3760
3925
|
context.on("btcLogOut", () => __async(this, null, function* () {
|
3761
3926
|
console.log("btcLogOut");
|
3927
|
+
state.clear();
|
3762
3928
|
emitter.emit("accountsChanged", { accounts: [] });
|
3763
3929
|
yield handleConnectionUpdate();
|
3764
3930
|
}));
|
@@ -3802,9 +3968,7 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
|
|
3802
3968
|
"get_chain_signature_near_account_public_key",
|
3803
3969
|
{ btc_public_key: btcPublicKey }
|
3804
3970
|
);
|
3805
|
-
state.
|
3806
|
-
state.savePublicKey(nearPublicKey);
|
3807
|
-
state.saveBtcPublicKey(btcPublicKey);
|
3971
|
+
state.syncSave(csna, nearPublicKey, btcPublicKey);
|
3808
3972
|
return {
|
3809
3973
|
nearAddress: csna,
|
3810
3974
|
nearPublicKey
|
@@ -3814,10 +3978,8 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
|
|
3814
3978
|
function signIn(_02) {
|
3815
3979
|
return __async(this, arguments, function* ({ contractId, methodNames }) {
|
3816
3980
|
const btcContext = window.btcContext;
|
3817
|
-
|
3818
|
-
|
3819
|
-
console.log("isLogin:", accountId && publicKey);
|
3820
|
-
if (!accountId || !publicKey) {
|
3981
|
+
state.clear();
|
3982
|
+
if (!state.getAccount() || !state.getPublicKey()) {
|
3821
3983
|
yield btcContext.login();
|
3822
3984
|
}
|
3823
3985
|
const btcPublicKey = yield btcContext.getPublicKey();
|
@@ -3883,6 +4045,9 @@ var BTCWallet = (_0) => __async(void 0, [_0], function* ({
|
|
3883
4045
|
}
|
3884
4046
|
function signAndSendTransactions(params) {
|
3885
4047
|
return __async(this, null, function* () {
|
4048
|
+
if (!validateWalletState()) {
|
4049
|
+
throw new Error("Wallet state is invalid, please reconnect your wallet.");
|
4050
|
+
}
|
3886
4051
|
const btcContext = window.btcContext;
|
3887
4052
|
const accountId = state.getAccount();
|
3888
4053
|
const accountInfo = yield getAccountInfo(accountId, currentConfig.accountContractId);
|
@@ -4089,18 +4254,6 @@ function setupBTCWallet({
|
|
4089
4254
|
env = "mainnet"
|
4090
4255
|
} = {}) {
|
4091
4256
|
console.log("\u26A1\uFE0F BTC Wallet Version:", getVersion(), "env:", env);
|
4092
|
-
if (env === "private_mainnet" && typeof window !== "undefined") {
|
4093
|
-
setTimeout(() => {
|
4094
|
-
const hasShownNotice = localStorage.getItem("satoshi_private_mainnet_notice");
|
4095
|
-
if (!hasShownNotice) {
|
4096
|
-
Dialog.alert({
|
4097
|
-
title: "Notice",
|
4098
|
-
message: "You are currently using Satoshi Private Mainnet. This is a private version for testing. Please try a small amount of assets in Ramp"
|
4099
|
-
});
|
4100
|
-
localStorage.setItem("satoshi_private_mainnet_notice", "true");
|
4101
|
-
}
|
4102
|
-
}, 1e3);
|
4103
|
-
}
|
4104
4257
|
const btcWallet = () => __async(this, null, function* () {
|
4105
4258
|
return {
|
4106
4259
|
id: "btc-wallet",
|
@@ -4124,7 +4277,7 @@ function setupBTCWallet({
|
|
4124
4277
|
|
4125
4278
|
// src/index.ts
|
4126
4279
|
var getVersion = () => {
|
4127
|
-
return "0.4.
|
4280
|
+
return "0.4.7-beta";
|
4128
4281
|
};
|
4129
4282
|
if (typeof window !== "undefined") {
|
4130
4283
|
window.__BTC_WALLET_VERSION = getVersion();
|