@shadow-corp/nearconnect 1.0.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/README.md +546 -0
- package/build/InjectedWallet.d.ts +22 -0
- package/build/InjectedWallet.js +58 -0
- package/build/InjectedWallet.js.map +1 -0
- package/build/NearConnector.d.ts +151 -0
- package/build/NearConnector.js +536 -0
- package/build/NearConnector.js.map +1 -0
- package/build/ParentFrameWallet.d.ts +22 -0
- package/build/ParentFrameWallet.js +66 -0
- package/build/ParentFrameWallet.js.map +1 -0
- package/build/SandboxedWallet/code.d.ts +7 -0
- package/build/SandboxedWallet/code.js +324 -0
- package/build/SandboxedWallet/code.js.map +1 -0
- package/build/SandboxedWallet/executor.d.ts +23 -0
- package/build/SandboxedWallet/executor.js +338 -0
- package/build/SandboxedWallet/executor.js.map +1 -0
- package/build/SandboxedWallet/iframe.d.ts +18 -0
- package/build/SandboxedWallet/iframe.js +78 -0
- package/build/SandboxedWallet/iframe.js.map +1 -0
- package/build/SandboxedWallet/index.d.ts +24 -0
- package/build/SandboxedWallet/index.js +54 -0
- package/build/SandboxedWallet/index.js.map +1 -0
- package/build/actions/index.d.ts +3 -0
- package/build/actions/index.js +105 -0
- package/build/actions/index.js.map +1 -0
- package/build/actions/types.d.ts +76 -0
- package/build/actions/types.js +3 -0
- package/build/actions/types.js.map +1 -0
- package/build/connection/health.d.ts +213 -0
- package/build/connection/health.js +391 -0
- package/build/connection/health.js.map +1 -0
- package/build/connection/index.d.ts +4 -0
- package/build/connection/index.js +48 -0
- package/build/connection/index.js.map +1 -0
- package/build/connection/reconnect.d.ts +261 -0
- package/build/connection/reconnect.js +454 -0
- package/build/connection/reconnect.js.map +1 -0
- package/build/connection/retry.d.ts +187 -0
- package/build/connection/retry.js +427 -0
- package/build/connection/retry.js.map +1 -0
- package/build/connection/state.d.ts +222 -0
- package/build/connection/state.js +431 -0
- package/build/connection/state.js.map +1 -0
- package/build/errors.d.ts +177 -0
- package/build/errors.js +546 -0
- package/build/errors.js.map +1 -0
- package/build/hardware/errors.d.ts +36 -0
- package/build/hardware/errors.js +127 -0
- package/build/hardware/errors.js.map +1 -0
- package/build/hardware/index.d.ts +7 -0
- package/build/hardware/index.js +39 -0
- package/build/hardware/index.js.map +1 -0
- package/build/hardware/near-app.d.ts +95 -0
- package/build/hardware/near-app.js +291 -0
- package/build/hardware/near-app.js.map +1 -0
- package/build/hardware/transport.d.ts +94 -0
- package/build/hardware/transport.js +267 -0
- package/build/hardware/transport.js.map +1 -0
- package/build/hardware/types.d.ts +98 -0
- package/build/hardware/types.js +72 -0
- package/build/hardware/types.js.map +1 -0
- package/build/helpers/analytics.d.ts +191 -0
- package/build/helpers/analytics.js +304 -0
- package/build/helpers/analytics.js.map +1 -0
- package/build/helpers/base58.d.ts +6 -0
- package/build/helpers/base58.js +47 -0
- package/build/helpers/base58.js.map +1 -0
- package/build/helpers/events.d.ts +42 -0
- package/build/helpers/events.js +68 -0
- package/build/helpers/events.js.map +1 -0
- package/build/helpers/html.d.ts +8 -0
- package/build/helpers/html.js +30 -0
- package/build/helpers/html.js.map +1 -0
- package/build/helpers/indexdb.d.ts +14 -0
- package/build/helpers/indexdb.js +166 -0
- package/build/helpers/indexdb.js.map +1 -0
- package/build/helpers/manifest.d.ts +147 -0
- package/build/helpers/manifest.js +329 -0
- package/build/helpers/manifest.js.map +1 -0
- package/build/helpers/queue.d.ts +11 -0
- package/build/helpers/queue.js +48 -0
- package/build/helpers/queue.js.map +1 -0
- package/build/helpers/session.d.ts +119 -0
- package/build/helpers/session.js +289 -0
- package/build/helpers/session.js.map +1 -0
- package/build/helpers/simulation.d.ts +128 -0
- package/build/helpers/simulation.js +441 -0
- package/build/helpers/simulation.js.map +1 -0
- package/build/helpers/storage.d.ts +58 -0
- package/build/helpers/storage.js +190 -0
- package/build/helpers/storage.js.map +1 -0
- package/build/helpers/trust.d.ts +157 -0
- package/build/helpers/trust.js +340 -0
- package/build/helpers/trust.js.map +1 -0
- package/build/helpers/url.d.ts +1 -0
- package/build/helpers/url.js +13 -0
- package/build/helpers/url.js.map +1 -0
- package/build/helpers/uuid.d.ts +1 -0
- package/build/helpers/uuid.js +14 -0
- package/build/helpers/uuid.js.map +1 -0
- package/build/index.d.ts +21 -0
- package/build/index.js +167 -0
- package/build/index.js.map +1 -0
- package/build/popups/IframeWalletPopup.d.ts +16 -0
- package/build/popups/IframeWalletPopup.js +38 -0
- package/build/popups/IframeWalletPopup.js.map +1 -0
- package/build/popups/NearWalletsPopup.d.ts +25 -0
- package/build/popups/NearWalletsPopup.js +153 -0
- package/build/popups/NearWalletsPopup.js.map +1 -0
- package/build/popups/Popup.d.ts +22 -0
- package/build/popups/Popup.js +94 -0
- package/build/popups/Popup.js.map +1 -0
- package/build/popups/styles.d.ts +1 -0
- package/build/popups/styles.js +257 -0
- package/build/popups/styles.js.map +1 -0
- package/build/security/audit-log.d.ts +123 -0
- package/build/security/audit-log.js +268 -0
- package/build/security/audit-log.js.map +1 -0
- package/build/security/csp.d.ts +68 -0
- package/build/security/csp.js +328 -0
- package/build/security/csp.js.map +1 -0
- package/build/security/index.d.ts +10 -0
- package/build/security/index.js +42 -0
- package/build/security/index.js.map +1 -0
- package/build/security/origin-guard.d.ts +90 -0
- package/build/security/origin-guard.js +244 -0
- package/build/security/origin-guard.js.map +1 -0
- package/build/security/rate-limiter.d.ts +84 -0
- package/build/security/rate-limiter.js +212 -0
- package/build/security/rate-limiter.js.map +1 -0
- package/build/security/secure-storage.d.ts +77 -0
- package/build/security/secure-storage.js +242 -0
- package/build/security/secure-storage.js.map +1 -0
- package/build/security/transaction-guard.d.ts +71 -0
- package/build/security/transaction-guard.js +239 -0
- package/build/security/transaction-guard.js.map +1 -0
- package/build/types.d.ts +508 -0
- package/build/types.js +3 -0
- package/build/types.js.map +1 -0
- package/build/ui/AccountSwitcherModal.d.ts +53 -0
- package/build/ui/AccountSwitcherModal.js +239 -0
- package/build/ui/AccountSwitcherModal.js.map +1 -0
- package/build/ui/Modal.d.ts +84 -0
- package/build/ui/Modal.js +278 -0
- package/build/ui/Modal.js.map +1 -0
- package/build/ui/TransactionModal.d.ts +84 -0
- package/build/ui/TransactionModal.js +406 -0
- package/build/ui/TransactionModal.js.map +1 -0
- package/build/ui/WalletSelectorModal.d.ts +97 -0
- package/build/ui/WalletSelectorModal.js +481 -0
- package/build/ui/WalletSelectorModal.js.map +1 -0
- package/build/ui/icons.d.ts +19 -0
- package/build/ui/icons.js +65 -0
- package/build/ui/icons.js.map +1 -0
- package/build/ui/index.d.ts +10 -0
- package/build/ui/index.js +31 -0
- package/build/ui/index.js.map +1 -0
- package/build/ui/styles.d.ts +5 -0
- package/build/ui/styles.js +973 -0
- package/build/ui/styles.js.map +1 -0
- package/build/ui/theme.d.ts +133 -0
- package/build/ui/theme.js +204 -0
- package/build/ui/theme.js.map +1 -0
- package/build/wallets/external/index.d.ts +4 -0
- package/build/wallets/external/index.js +9 -0
- package/build/wallets/external/index.js.map +1 -0
- package/build/wallets/external/manager.d.ts +152 -0
- package/build/wallets/external/manager.js +586 -0
- package/build/wallets/external/manager.js.map +1 -0
- package/build/wallets/privileged/index.d.ts +5 -0
- package/build/wallets/privileged/index.js +12 -0
- package/build/wallets/privileged/index.js.map +1 -0
- package/build/wallets/privileged/ledger.d.ts +132 -0
- package/build/wallets/privileged/ledger.js +563 -0
- package/build/wallets/privileged/ledger.js.map +1 -0
- package/build/wallets/privileged/manager.d.ts +54 -0
- package/build/wallets/privileged/manager.js +174 -0
- package/build/wallets/privileged/manager.js.map +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransactionSimulator = void 0;
|
|
4
|
+
exports.quickGasEstimate = quickGasEstimate;
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
/**
|
|
7
|
+
* Default RPC endpoints
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_RPC_ENDPOINTS = {
|
|
10
|
+
mainnet: "https://rpc.mainnet.near.org",
|
|
11
|
+
testnet: "https://rpc.testnet.near.org",
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Gas constants
|
|
15
|
+
*/
|
|
16
|
+
const GAS_CONSTANTS = {
|
|
17
|
+
/** Base gas for a function call */
|
|
18
|
+
BASE_FUNCTION_CALL: 5000000000000n, // 5 TGas
|
|
19
|
+
/** Gas per byte of arguments */
|
|
20
|
+
GAS_PER_BYTE: 100000000n, // 0.0001 TGas
|
|
21
|
+
/** Base gas for transfer */
|
|
22
|
+
TRANSFER_GAS: 450000000000n, // 0.45 TGas
|
|
23
|
+
/** Base gas for creating account */
|
|
24
|
+
CREATE_ACCOUNT_GAS: 1000000000000n, // 1 TGas
|
|
25
|
+
/** Base gas for add key */
|
|
26
|
+
ADD_KEY_GAS: 1000000000000n, // 1 TGas
|
|
27
|
+
/** Base gas for delete key */
|
|
28
|
+
DELETE_KEY_GAS: 450000000000n, // 0.45 TGas
|
|
29
|
+
/** Base gas for deploy contract */
|
|
30
|
+
DEPLOY_CONTRACT_BASE: 10000000000000n, // 10 TGas
|
|
31
|
+
/** Gas per byte of contract code */
|
|
32
|
+
DEPLOY_GAS_PER_BYTE: 6812999n,
|
|
33
|
+
/** Base gas for stake */
|
|
34
|
+
STAKE_GAS: 450000000000n, // 0.45 TGas
|
|
35
|
+
/** Base gas for delete account */
|
|
36
|
+
DELETE_ACCOUNT_GAS: 450000000000n, // 0.45 TGas
|
|
37
|
+
/** Maximum gas allowed */
|
|
38
|
+
MAX_GAS: 300000000000000n, // 300 TGas
|
|
39
|
+
/** Gas price in yoctoNEAR (approximate) */
|
|
40
|
+
GAS_PRICE: 100000000n, // 0.0001 NEAR per TGas
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* High deposit threshold in NEAR
|
|
44
|
+
*/
|
|
45
|
+
const HIGH_DEPOSIT_THRESHOLD = 10n * 10n ** 24n; // 10 NEAR
|
|
46
|
+
/**
|
|
47
|
+
* Transaction simulator
|
|
48
|
+
*/
|
|
49
|
+
class TransactionSimulator {
|
|
50
|
+
network;
|
|
51
|
+
rpcEndpoint;
|
|
52
|
+
constructor(options = {}) {
|
|
53
|
+
this.network = options.network ?? "mainnet";
|
|
54
|
+
this.rpcEndpoint = options.rpcEndpoint ?? DEFAULT_RPC_ENDPOINTS[this.network];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Simulate a transaction and get gas estimates
|
|
58
|
+
*/
|
|
59
|
+
async simulate(transaction, signerAccount) {
|
|
60
|
+
const warnings = [];
|
|
61
|
+
const logs = [];
|
|
62
|
+
let success = true;
|
|
63
|
+
let error;
|
|
64
|
+
let returnValue;
|
|
65
|
+
// Calculate gas estimate
|
|
66
|
+
const gasEstimate = await this.estimateGas(transaction, signerAccount);
|
|
67
|
+
// Calculate total deposit
|
|
68
|
+
const totalDeposit = this.calculateTotalDeposit(transaction);
|
|
69
|
+
const totalDepositNear = this.formatNear(totalDeposit);
|
|
70
|
+
// Check for high deposit
|
|
71
|
+
if (BigInt(totalDeposit) > HIGH_DEPOSIT_THRESHOLD) {
|
|
72
|
+
warnings.push({
|
|
73
|
+
type: "high_deposit",
|
|
74
|
+
message: `This transaction requires a large deposit of ${totalDepositNear}`,
|
|
75
|
+
severity: "warning",
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// Check for dangerous actions
|
|
79
|
+
this.checkDangerousActions(transaction, warnings);
|
|
80
|
+
// Check account balance
|
|
81
|
+
try {
|
|
82
|
+
const balance = await this.getAccountBalance(signerAccount.accountId);
|
|
83
|
+
const requiredBalance = BigInt(totalDeposit) + BigInt(gasEstimate.gasCostNear.replace(" NEAR", "")) * 10n ** 24n;
|
|
84
|
+
if (BigInt(balance) < requiredBalance) {
|
|
85
|
+
warnings.push({
|
|
86
|
+
type: "low_balance",
|
|
87
|
+
message: "Account balance may be insufficient for this transaction",
|
|
88
|
+
severity: "warning",
|
|
89
|
+
});
|
|
90
|
+
gasEstimate.canAfford = false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Can't check balance, skip
|
|
95
|
+
}
|
|
96
|
+
// Try to simulate function calls via RPC
|
|
97
|
+
if (transaction.actions) {
|
|
98
|
+
for (const action of transaction.actions) {
|
|
99
|
+
if (typeof action === "object" && ("FunctionCall" in action || "functionCall" in action)) {
|
|
100
|
+
const fc = action.FunctionCall ?? action.functionCall;
|
|
101
|
+
const fcData = fc;
|
|
102
|
+
try {
|
|
103
|
+
const result = await this.simulateFunctionCall(transaction.receiverId, fcData.methodName, fcData.args);
|
|
104
|
+
if (result.logs)
|
|
105
|
+
logs.push(...result.logs);
|
|
106
|
+
if (result.result)
|
|
107
|
+
returnValue = result.result;
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
success = false;
|
|
111
|
+
error = e instanceof Error ? e.message : "Simulation failed";
|
|
112
|
+
logs.push(`Simulation error: ${error}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
success,
|
|
119
|
+
gasEstimate,
|
|
120
|
+
totalDeposit,
|
|
121
|
+
totalDepositNear,
|
|
122
|
+
logs,
|
|
123
|
+
returnValue,
|
|
124
|
+
error,
|
|
125
|
+
warnings,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Estimate gas for a transaction
|
|
130
|
+
*/
|
|
131
|
+
async estimateGas(transaction, signerAccount) {
|
|
132
|
+
const breakdown = [];
|
|
133
|
+
let totalGas = 0n;
|
|
134
|
+
if (!transaction.actions) {
|
|
135
|
+
return {
|
|
136
|
+
gas: "0",
|
|
137
|
+
tgas: 0,
|
|
138
|
+
gasCostNear: "0 NEAR",
|
|
139
|
+
canAfford: true,
|
|
140
|
+
breakdown: [],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
for (const action of transaction.actions) {
|
|
144
|
+
const estimate = this.estimateActionGas(action);
|
|
145
|
+
breakdown.push(estimate);
|
|
146
|
+
totalGas += BigInt(estimate.gas);
|
|
147
|
+
}
|
|
148
|
+
// Cap at max gas
|
|
149
|
+
if (totalGas > GAS_CONSTANTS.MAX_GAS) {
|
|
150
|
+
totalGas = GAS_CONSTANTS.MAX_GAS;
|
|
151
|
+
}
|
|
152
|
+
const tgas = Number(totalGas) / 1e12;
|
|
153
|
+
const gasCostYocto = totalGas * GAS_CONSTANTS.GAS_PRICE;
|
|
154
|
+
const gasCostNear = this.formatNear(gasCostYocto.toString());
|
|
155
|
+
// Check if account can afford
|
|
156
|
+
let canAfford = true;
|
|
157
|
+
try {
|
|
158
|
+
const balance = await this.getAccountBalance(signerAccount.accountId);
|
|
159
|
+
canAfford = BigInt(balance) >= gasCostYocto;
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Assume can afford if we can't check
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
gas: totalGas.toString(),
|
|
166
|
+
tgas,
|
|
167
|
+
gasCostNear,
|
|
168
|
+
canAfford,
|
|
169
|
+
breakdown,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Estimate gas for a single action
|
|
174
|
+
*/
|
|
175
|
+
estimateActionGas(action) {
|
|
176
|
+
if (typeof action === "string") {
|
|
177
|
+
return { type: action, gas: GAS_CONSTANTS.BASE_FUNCTION_CALL.toString(), tgas: 5 };
|
|
178
|
+
}
|
|
179
|
+
const actionType = Object.keys(action)[0];
|
|
180
|
+
const actionData = action[actionType];
|
|
181
|
+
switch (actionType) {
|
|
182
|
+
case "FunctionCall":
|
|
183
|
+
case "functionCall": {
|
|
184
|
+
const fc = actionData;
|
|
185
|
+
// Use provided gas or estimate
|
|
186
|
+
if (fc.gas) {
|
|
187
|
+
const gas = BigInt(fc.gas);
|
|
188
|
+
return {
|
|
189
|
+
type: "FunctionCall",
|
|
190
|
+
methodName: fc.methodName,
|
|
191
|
+
gas: gas.toString(),
|
|
192
|
+
tgas: Number(gas) / 1e12,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
// Estimate based on args size
|
|
196
|
+
const argsSize = fc.args ? (typeof fc.args === "string" ? fc.args.length : fc.args.length) : 0;
|
|
197
|
+
const gas = GAS_CONSTANTS.BASE_FUNCTION_CALL + BigInt(argsSize) * GAS_CONSTANTS.GAS_PER_BYTE;
|
|
198
|
+
return {
|
|
199
|
+
type: "FunctionCall",
|
|
200
|
+
methodName: fc.methodName,
|
|
201
|
+
gas: gas.toString(),
|
|
202
|
+
tgas: Number(gas) / 1e12,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
case "Transfer":
|
|
206
|
+
case "transfer":
|
|
207
|
+
return { type: "Transfer", gas: GAS_CONSTANTS.TRANSFER_GAS.toString(), tgas: 0.45 };
|
|
208
|
+
case "CreateAccount":
|
|
209
|
+
case "createAccount":
|
|
210
|
+
return { type: "CreateAccount", gas: GAS_CONSTANTS.CREATE_ACCOUNT_GAS.toString(), tgas: 1 };
|
|
211
|
+
case "AddKey":
|
|
212
|
+
case "addKey":
|
|
213
|
+
return { type: "AddKey", gas: GAS_CONSTANTS.ADD_KEY_GAS.toString(), tgas: 1 };
|
|
214
|
+
case "DeleteKey":
|
|
215
|
+
case "deleteKey":
|
|
216
|
+
return { type: "DeleteKey", gas: GAS_CONSTANTS.DELETE_KEY_GAS.toString(), tgas: 0.45 };
|
|
217
|
+
case "DeployContract":
|
|
218
|
+
case "deployContract": {
|
|
219
|
+
const dc = actionData;
|
|
220
|
+
const codeSize = dc.code?.length ?? 0;
|
|
221
|
+
const gas = GAS_CONSTANTS.DEPLOY_CONTRACT_BASE + BigInt(codeSize) * GAS_CONSTANTS.DEPLOY_GAS_PER_BYTE;
|
|
222
|
+
return { type: "DeployContract", gas: gas.toString(), tgas: Number(gas) / 1e12 };
|
|
223
|
+
}
|
|
224
|
+
case "Stake":
|
|
225
|
+
case "stake":
|
|
226
|
+
return { type: "Stake", gas: GAS_CONSTANTS.STAKE_GAS.toString(), tgas: 0.45 };
|
|
227
|
+
case "DeleteAccount":
|
|
228
|
+
case "deleteAccount":
|
|
229
|
+
return { type: "DeleteAccount", gas: GAS_CONSTANTS.DELETE_ACCOUNT_GAS.toString(), tgas: 0.45 };
|
|
230
|
+
default:
|
|
231
|
+
return { type: actionType, gas: GAS_CONSTANTS.BASE_FUNCTION_CALL.toString(), tgas: 5 };
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Calculate total deposit required
|
|
236
|
+
*/
|
|
237
|
+
calculateTotalDeposit(transaction) {
|
|
238
|
+
if (!transaction.actions)
|
|
239
|
+
return "0";
|
|
240
|
+
let total = 0n;
|
|
241
|
+
for (const action of transaction.actions) {
|
|
242
|
+
if (typeof action === "object") {
|
|
243
|
+
const actionType = Object.keys(action)[0];
|
|
244
|
+
const actionData = action[actionType];
|
|
245
|
+
if (actionType === "FunctionCall" || actionType === "functionCall") {
|
|
246
|
+
const fc = actionData;
|
|
247
|
+
if (fc.deposit)
|
|
248
|
+
total += BigInt(fc.deposit);
|
|
249
|
+
}
|
|
250
|
+
else if (actionType === "Transfer" || actionType === "transfer") {
|
|
251
|
+
const t = actionData;
|
|
252
|
+
if (t.deposit)
|
|
253
|
+
total += BigInt(t.deposit);
|
|
254
|
+
}
|
|
255
|
+
else if (actionType === "Stake" || actionType === "stake") {
|
|
256
|
+
const s = actionData;
|
|
257
|
+
if (s.stake)
|
|
258
|
+
total += BigInt(s.stake);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return total.toString();
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Check for dangerous actions
|
|
266
|
+
*/
|
|
267
|
+
checkDangerousActions(transaction, warnings) {
|
|
268
|
+
if (!transaction.actions)
|
|
269
|
+
return;
|
|
270
|
+
for (const action of transaction.actions) {
|
|
271
|
+
if (typeof action === "object") {
|
|
272
|
+
const actionType = Object.keys(action)[0];
|
|
273
|
+
if (actionType === "DeleteAccount" || actionType === "deleteAccount") {
|
|
274
|
+
warnings.push({
|
|
275
|
+
type: "dangerous_action",
|
|
276
|
+
message: "This transaction will DELETE your account permanently!",
|
|
277
|
+
severity: "error",
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
if (actionType === "DeleteKey" || actionType === "deleteKey") {
|
|
281
|
+
warnings.push({
|
|
282
|
+
type: "dangerous_action",
|
|
283
|
+
message: "This transaction will remove an access key from your account",
|
|
284
|
+
severity: "warning",
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
if (actionType === "AddKey" || actionType === "addKey") {
|
|
288
|
+
const ak = action[actionType];
|
|
289
|
+
if (ak.accessKey?.permission === "FullAccess") {
|
|
290
|
+
warnings.push({
|
|
291
|
+
type: "dangerous_action",
|
|
292
|
+
message: "This transaction grants FULL ACCESS to your account",
|
|
293
|
+
severity: "error",
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Simulate a function call via RPC view call
|
|
302
|
+
*/
|
|
303
|
+
async simulateFunctionCall(contractId, methodName, args) {
|
|
304
|
+
const argsBase64 = args
|
|
305
|
+
? typeof args === "string"
|
|
306
|
+
? btoa(args)
|
|
307
|
+
: btoa(String.fromCharCode(...args))
|
|
308
|
+
: "";
|
|
309
|
+
try {
|
|
310
|
+
const response = await fetch(this.rpcEndpoint, {
|
|
311
|
+
method: "POST",
|
|
312
|
+
headers: { "Content-Type": "application/json" },
|
|
313
|
+
body: JSON.stringify({
|
|
314
|
+
jsonrpc: "2.0",
|
|
315
|
+
id: "simulation",
|
|
316
|
+
method: "query",
|
|
317
|
+
params: {
|
|
318
|
+
request_type: "call_function",
|
|
319
|
+
finality: "optimistic",
|
|
320
|
+
account_id: contractId,
|
|
321
|
+
method_name: methodName,
|
|
322
|
+
args_base64: argsBase64,
|
|
323
|
+
},
|
|
324
|
+
}),
|
|
325
|
+
});
|
|
326
|
+
const data = await response.json();
|
|
327
|
+
if (data.error) {
|
|
328
|
+
throw new errors_1.WalletError({
|
|
329
|
+
code: errors_1.ErrorCode.RPC_ERROR,
|
|
330
|
+
message: data.error.message ?? "RPC call failed",
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
const result = data.result;
|
|
334
|
+
const logs = result?.logs ?? [];
|
|
335
|
+
let parsedResult;
|
|
336
|
+
if (result?.result) {
|
|
337
|
+
try {
|
|
338
|
+
const decoded = String.fromCharCode(...result.result);
|
|
339
|
+
parsedResult = JSON.parse(decoded);
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
parsedResult = result.result;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return { result: parsedResult, logs };
|
|
346
|
+
}
|
|
347
|
+
catch (e) {
|
|
348
|
+
if (e instanceof errors_1.WalletError)
|
|
349
|
+
throw e;
|
|
350
|
+
throw new errors_1.WalletError({
|
|
351
|
+
code: errors_1.ErrorCode.RPC_ERROR,
|
|
352
|
+
message: e instanceof Error ? e.message : "Simulation failed",
|
|
353
|
+
originalError: e instanceof Error ? e : undefined,
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Get account balance
|
|
359
|
+
*/
|
|
360
|
+
async getAccountBalance(accountId) {
|
|
361
|
+
try {
|
|
362
|
+
const response = await fetch(this.rpcEndpoint, {
|
|
363
|
+
method: "POST",
|
|
364
|
+
headers: { "Content-Type": "application/json" },
|
|
365
|
+
body: JSON.stringify({
|
|
366
|
+
jsonrpc: "2.0",
|
|
367
|
+
id: "balance",
|
|
368
|
+
method: "query",
|
|
369
|
+
params: {
|
|
370
|
+
request_type: "view_account",
|
|
371
|
+
finality: "optimistic",
|
|
372
|
+
account_id: accountId,
|
|
373
|
+
},
|
|
374
|
+
}),
|
|
375
|
+
});
|
|
376
|
+
const data = await response.json();
|
|
377
|
+
return data.result?.amount ?? "0";
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
return "0";
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Format yoctoNEAR to NEAR
|
|
385
|
+
*/
|
|
386
|
+
formatNear(yocto) {
|
|
387
|
+
try {
|
|
388
|
+
const value = BigInt(yocto);
|
|
389
|
+
const near = Number(value) / 1e24;
|
|
390
|
+
if (near < 0.0001 && near > 0) {
|
|
391
|
+
return "< 0.0001 NEAR";
|
|
392
|
+
}
|
|
393
|
+
return `${near.toFixed(4)} NEAR`;
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
return "0 NEAR";
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Set network
|
|
401
|
+
*/
|
|
402
|
+
setNetwork(network) {
|
|
403
|
+
this.network = network;
|
|
404
|
+
this.rpcEndpoint = DEFAULT_RPC_ENDPOINTS[network];
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Set custom RPC endpoint
|
|
408
|
+
*/
|
|
409
|
+
setRpcEndpoint(endpoint) {
|
|
410
|
+
this.rpcEndpoint = endpoint;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
exports.TransactionSimulator = TransactionSimulator;
|
|
414
|
+
/**
|
|
415
|
+
* Quick gas estimate without full simulation
|
|
416
|
+
*/
|
|
417
|
+
function quickGasEstimate(transaction) {
|
|
418
|
+
const simulator = new TransactionSimulator();
|
|
419
|
+
const breakdown = [];
|
|
420
|
+
let totalGas = 0n;
|
|
421
|
+
if (transaction.actions) {
|
|
422
|
+
for (const action of transaction.actions) {
|
|
423
|
+
const estimate = simulator.estimateActionGas(action);
|
|
424
|
+
breakdown.push(estimate);
|
|
425
|
+
totalGas += BigInt(estimate.gas);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
if (totalGas > GAS_CONSTANTS.MAX_GAS) {
|
|
429
|
+
totalGas = GAS_CONSTANTS.MAX_GAS;
|
|
430
|
+
}
|
|
431
|
+
const tgas = Number(totalGas) / 1e12;
|
|
432
|
+
const gasCostYocto = totalGas * GAS_CONSTANTS.GAS_PRICE;
|
|
433
|
+
return {
|
|
434
|
+
gas: totalGas.toString(),
|
|
435
|
+
tgas,
|
|
436
|
+
gasCostNear: `${(Number(gasCostYocto) / 1e24).toFixed(6)} NEAR`,
|
|
437
|
+
canAfford: true, // Can't check without account
|
|
438
|
+
breakdown,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
//# sourceMappingURL=simulation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulation.js","sourceRoot":"","sources":["../../src/helpers/simulation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export interface DataStorage {
|
|
2
|
+
get(key: string): Promise<string | null>;
|
|
3
|
+
set(key: string, value: string): Promise<void>;
|
|
4
|
+
remove(key: string): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* localStorage adapter - persists across browser sessions
|
|
8
|
+
*/
|
|
9
|
+
export declare class LocalStorage implements DataStorage {
|
|
10
|
+
get(key: string): Promise<string | null>;
|
|
11
|
+
set(key: string, value: string): Promise<void>;
|
|
12
|
+
remove(key: string): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* sessionStorage adapter - cleared when browser tab closes
|
|
16
|
+
*/
|
|
17
|
+
export declare class SessionStorage implements DataStorage {
|
|
18
|
+
get(key: string): Promise<string | null>;
|
|
19
|
+
set(key: string, value: string): Promise<void>;
|
|
20
|
+
remove(key: string): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Memory-only adapter - no persistence, lost on page refresh
|
|
24
|
+
*/
|
|
25
|
+
export declare class MemoryStorage implements DataStorage {
|
|
26
|
+
private data;
|
|
27
|
+
get(key: string): Promise<string | null>;
|
|
28
|
+
set(key: string, value: string): Promise<void>;
|
|
29
|
+
remove(key: string): Promise<void>;
|
|
30
|
+
clear(): void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* IndexedDB adapter - for larger data, survives browser sessions
|
|
34
|
+
*/
|
|
35
|
+
export declare class IndexedDBStorage implements DataStorage {
|
|
36
|
+
private dbName;
|
|
37
|
+
private storeName;
|
|
38
|
+
private dbPromise;
|
|
39
|
+
constructor(dbName?: string, storeName?: string);
|
|
40
|
+
private getDB;
|
|
41
|
+
get(key: string): Promise<string | null>;
|
|
42
|
+
set(key: string, value: string): Promise<void>;
|
|
43
|
+
remove(key: string): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Encrypted storage wrapper - encrypts data before storing
|
|
47
|
+
* Uses AES-GCM with a derived key from password
|
|
48
|
+
*/
|
|
49
|
+
export declare class EncryptedStorage implements DataStorage {
|
|
50
|
+
private storage;
|
|
51
|
+
private keyPromise;
|
|
52
|
+
private password;
|
|
53
|
+
constructor(storage: DataStorage, password: string);
|
|
54
|
+
private getKey;
|
|
55
|
+
get(key: string): Promise<string | null>;
|
|
56
|
+
set(key: string, value: string): Promise<void>;
|
|
57
|
+
remove(key: string): Promise<void>;
|
|
58
|
+
}
|