@dynamic-labs/sui 4.14.0 → 4.16.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 +31 -0
- package/package.cjs +1 -1
- package/package.js +1 -1
- package/package.json +9 -9
- package/src/SuiWalletConnector.cjs +27 -0
- package/src/SuiWalletConnector.d.ts +3 -1
- package/src/SuiWalletConnector.js +27 -0
- package/src/index.cjs +2 -0
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/utils/SuiUiTransaction/SuiUiTransaction.cjs +125 -0
- package/src/utils/SuiUiTransaction/SuiUiTransaction.d.ts +47 -0
- package/src/utils/SuiUiTransaction/SuiUiTransaction.js +121 -0
- package/src/utils/SuiUiTransaction/index.d.ts +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,35 @@
|
|
|
1
1
|
|
|
2
|
+
## [4.16.0](https://github.com/dynamic-labs/dynamic-auth/compare/v4.15.0...v4.16.0) (2025-05-03)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
* (GVTY-3020) add send balance to waas sui connector ([#8638](https://github.com/dynamic-labs/dynamic-auth/issues/8638)) ([97f0af0](https://github.com/dynamic-labs/dynamic-auth/commit/97f0af0504a0079ebf0958fde1f8edc34c035927))
|
|
8
|
+
* add isAtomicSupported and isPaymasterServiceSupported methods to EthereumWallet ([#8627](https://github.com/dynamic-labs/dynamic-auth/issues/8627)) ([df82b9e](https://github.com/dynamic-labs/dynamic-auth/commit/df82b9e86eafea9dd6c505227722450bc56d7c57))
|
|
9
|
+
* add solana mpc to global wallets ([#8605](https://github.com/dynamic-labs/dynamic-auth/issues/8605)) ([6261bf9](https://github.com/dynamic-labs/dynamic-auth/commit/6261bf9bec45b1d1afa13869cf5d10cda215783e))
|
|
10
|
+
|
|
11
|
+
## [4.15.0](https://github.com/dynamic-labs/dynamic-auth/compare/v4.14.0...v4.15.0) (2025-04-30)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* add end session override for waas sui connector ([#8602](https://github.com/dynamic-labs/dynamic-auth/issues/8602)) ([6c9e6fd](https://github.com/dynamic-labs/dynamic-auth/commit/6c9e6fda4581a4e3b9e1544f22d6e5f03723d928))
|
|
17
|
+
* add presets and demo fixes ([#8609](https://github.com/dynamic-labs/dynamic-auth/issues/8609)) ([2201914](https://github.com/dynamic-labs/dynamic-auth/commit/2201914d2029ff0b67dfc2c6e696f728f32f57b3))
|
|
18
|
+
* add ShareConfig component with modal and styling ([74aff97](https://github.com/dynamic-labs/dynamic-auth/commit/74aff97689c9e7c9abc892c1deac4d748b498909))
|
|
19
|
+
* add wallet actions section and update UI components ([#8598](https://github.com/dynamic-labs/dynamic-auth/issues/8598)) ([d6170b7](https://github.com/dynamic-labs/dynamic-auth/commit/d6170b7f6abd963e6a081541e2c674b7141f1c15))
|
|
20
|
+
* dynamic waas to sign 7702 authorization ([#8603](https://github.com/dynamic-labs/dynamic-auth/issues/8603)) ([74e1722](https://github.com/dynamic-labs/dynamic-auth/commit/74e1722f417aab621f4062093e109dc45cf542ea))
|
|
21
|
+
* add signMessage feature to global wallet client ([#8563](https://github.com/dynamic-labs/dynamic-auth/issues/8563)) ([c3f9734](https://github.com/dynamic-labs/dynamic-auth/commit/c3f9734c097f5c9b88c35e0f642632f261e40fe7))
|
|
22
|
+
* allow displaying custom links in the global wallet profile dropdown menu ([#8617](https://github.com/dynamic-labs/dynamic-auth/issues/8617)) ([5fb956c](https://github.com/dynamic-labs/dynamic-auth/commit/5fb956c0c2b681fece56104b330a0e90fc8fb936))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Bug Fixes
|
|
26
|
+
|
|
27
|
+
* add default base api url for dynamic waas config on connector initialization ([#8604](https://github.com/dynamic-labs/dynamic-auth/issues/8604)) ([6218a7e](https://github.com/dynamic-labs/dynamic-auth/commit/6218a7edda4feb9028be548acfe8eff64578f0a0))
|
|
28
|
+
* enables caching for sprite.svg ([#8610](https://github.com/dynamic-labs/dynamic-auth/issues/8610)) ([decdb69](https://github.com/dynamic-labs/dynamic-auth/commit/decdb69b4df8bc2d97ee579fa423e9682ab1720b))
|
|
29
|
+
* change mobile experience to redirect ([#8003](https://github.com/dynamic-labs/dynamic-auth/issues/8003)) ([2e8a1d8](https://github.com/dynamic-labs/dynamic-auth/commit/2e8a1d8b54f54386e1abc9f4e6e5e9acf859e5fa))
|
|
30
|
+
* optimize wallet finder when performing eth and sol operations in global wallet popup ([#8564](https://github.com/dynamic-labs/dynamic-auth/issues/8564)) ([2eaf424](https://github.com/dynamic-labs/dynamic-auth/commit/2eaf4244d4aa1b1cc5c6e32574db10ab34f8ed80))
|
|
31
|
+
* loading state for v3 connect-only embedded wallet generation ([#8600](https://github.com/dynamic-labs/dynamic-auth/issues/8600)) ([af34d16](https://github.com/dynamic-labs/dynamic-auth/commit/af34d168a765aa82867116541e73c59672ab2341))
|
|
32
|
+
|
|
2
33
|
## [4.14.0](https://github.com/dynamic-labs/dynamic-auth/compare/v4.13.0...v4.14.0) (2025-04-25)
|
|
3
34
|
|
|
4
35
|
|
package/package.cjs
CHANGED
package/package.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynamic-labs/sui",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.16.0",
|
|
4
4
|
"description": "A React SDK for implementing wallet web3 authentication and authorization to your website.",
|
|
5
5
|
"author": "Dynamic Labs, Inc.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,17 +18,17 @@
|
|
|
18
18
|
},
|
|
19
19
|
"homepage": "https://www.dynamic.xyz/",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@dynamic-labs/sdk-api-core": "0.0.
|
|
21
|
+
"@dynamic-labs/sdk-api-core": "0.0.660",
|
|
22
22
|
"@mysten/wallet-standard": "0.13.29",
|
|
23
23
|
"@mysten/sui": "1.24.0",
|
|
24
24
|
"text-encoding": "0.7.0",
|
|
25
|
-
"@dynamic-labs/assert-package-version": "4.
|
|
26
|
-
"@dynamic-labs/logger": "4.
|
|
27
|
-
"@dynamic-labs/rpc-providers": "4.
|
|
28
|
-
"@dynamic-labs/types": "4.
|
|
29
|
-
"@dynamic-labs/utils": "4.
|
|
30
|
-
"@dynamic-labs/wallet-book": "4.
|
|
31
|
-
"@dynamic-labs/wallet-connector-core": "4.
|
|
25
|
+
"@dynamic-labs/assert-package-version": "4.16.0",
|
|
26
|
+
"@dynamic-labs/logger": "4.16.0",
|
|
27
|
+
"@dynamic-labs/rpc-providers": "4.16.0",
|
|
28
|
+
"@dynamic-labs/types": "4.16.0",
|
|
29
|
+
"@dynamic-labs/utils": "4.16.0",
|
|
30
|
+
"@dynamic-labs/wallet-book": "4.16.0",
|
|
31
|
+
"@dynamic-labs/wallet-connector-core": "4.16.0"
|
|
32
32
|
},
|
|
33
33
|
"peerDependencies": {}
|
|
34
34
|
}
|
|
@@ -10,6 +10,7 @@ var utils = require('@dynamic-labs/utils');
|
|
|
10
10
|
var logger = require('@dynamic-labs/logger');
|
|
11
11
|
var SuiWallet = require('./wallet/SuiWallet.cjs');
|
|
12
12
|
var networkHelpers = require('./utils/network/networkHelpers.cjs');
|
|
13
|
+
var SuiUiTransaction = require('./utils/SuiUiTransaction/SuiUiTransaction.cjs');
|
|
13
14
|
|
|
14
15
|
class SuiWalletConnector extends walletConnectorCore.WalletConnectorBase {
|
|
15
16
|
constructor(name, opts) {
|
|
@@ -239,6 +240,32 @@ class SuiWalletConnector extends walletConnectorCore.WalletConnectorBase {
|
|
|
239
240
|
return this.account;
|
|
240
241
|
});
|
|
241
242
|
}
|
|
243
|
+
/** Function used to create transactions in the SDK interface */
|
|
244
|
+
createUiTransaction(from) {
|
|
245
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
246
|
+
yield this.validateActiveWallet(from);
|
|
247
|
+
const suiClient = yield this.getSuiClient();
|
|
248
|
+
if (!suiClient) {
|
|
249
|
+
throw new utils.DynamicError('No Sui client available');
|
|
250
|
+
}
|
|
251
|
+
return new SuiUiTransaction.SuiUiTransaction({
|
|
252
|
+
client: suiClient,
|
|
253
|
+
from,
|
|
254
|
+
onSubmit: (transaction) => _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
255
|
+
var _a, _b;
|
|
256
|
+
if (!this.account || !transaction) {
|
|
257
|
+
throw new utils.DynamicError('No account or transaction found');
|
|
258
|
+
}
|
|
259
|
+
const result = yield ((_b = (_a = this.getFeatures()) === null || _a === void 0 ? void 0 : _a['sui:signAndExecuteTransaction']) === null || _b === void 0 ? void 0 : _b.signAndExecuteTransaction({
|
|
260
|
+
account: this.account,
|
|
261
|
+
chain: this.account.chains[0],
|
|
262
|
+
transaction,
|
|
263
|
+
}));
|
|
264
|
+
return result;
|
|
265
|
+
}),
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
}
|
|
242
269
|
teardownEventListeners() {
|
|
243
270
|
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
244
271
|
if (this.eventsUnsubscribeHandler) {
|
|
@@ -2,7 +2,7 @@ import { SuiWalletFeatures, WalletAccount, WalletWithFeatures } from '@mysten/wa
|
|
|
2
2
|
import { SuiClient } from '@mysten/sui/client';
|
|
3
3
|
import { Chain, WalletConnectorBase } from '@dynamic-labs/wallet-connector-core';
|
|
4
4
|
import { Logger } from '@dynamic-labs/logger';
|
|
5
|
-
import { GenericNetwork } from '@dynamic-labs/types';
|
|
5
|
+
import { GenericNetwork, IUITransaction } from '@dynamic-labs/types';
|
|
6
6
|
import { SuiWallet } from './wallet/SuiWallet';
|
|
7
7
|
import { SuiWalletConnectorProps, SuiWalletStandardEventHandler } from './types';
|
|
8
8
|
export declare abstract class SuiWalletConnector extends WalletConnectorBase<typeof SuiWallet> {
|
|
@@ -64,6 +64,8 @@ export declare abstract class SuiWalletConnector extends WalletConnectorBase<typ
|
|
|
64
64
|
getBalance(address: string): Promise<string | undefined>;
|
|
65
65
|
signMessage(messageToSign: string): Promise<string | undefined>;
|
|
66
66
|
getWalletAccount(): Promise<WalletAccount | undefined>;
|
|
67
|
+
/** Function used to create transactions in the SDK interface */
|
|
68
|
+
createUiTransaction(from: string): Promise<IUITransaction>;
|
|
67
69
|
teardownEventListeners(): Promise<void>;
|
|
68
70
|
endSession(): Promise<void>;
|
|
69
71
|
getEnabledNetworks(): GenericNetwork[];
|
|
@@ -6,6 +6,7 @@ import { DynamicError } from '@dynamic-labs/utils';
|
|
|
6
6
|
import { Logger } from '@dynamic-labs/logger';
|
|
7
7
|
import { SuiWallet } from './wallet/SuiWallet.js';
|
|
8
8
|
import { getSuiNetworkIdFromName, getPreferredRpcUrl } from './utils/network/networkHelpers.js';
|
|
9
|
+
import { SuiUiTransaction } from './utils/SuiUiTransaction/SuiUiTransaction.js';
|
|
9
10
|
|
|
10
11
|
class SuiWalletConnector extends WalletConnectorBase {
|
|
11
12
|
constructor(name, opts) {
|
|
@@ -235,6 +236,32 @@ class SuiWalletConnector extends WalletConnectorBase {
|
|
|
235
236
|
return this.account;
|
|
236
237
|
});
|
|
237
238
|
}
|
|
239
|
+
/** Function used to create transactions in the SDK interface */
|
|
240
|
+
createUiTransaction(from) {
|
|
241
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
242
|
+
yield this.validateActiveWallet(from);
|
|
243
|
+
const suiClient = yield this.getSuiClient();
|
|
244
|
+
if (!suiClient) {
|
|
245
|
+
throw new DynamicError('No Sui client available');
|
|
246
|
+
}
|
|
247
|
+
return new SuiUiTransaction({
|
|
248
|
+
client: suiClient,
|
|
249
|
+
from,
|
|
250
|
+
onSubmit: (transaction) => __awaiter(this, void 0, void 0, function* () {
|
|
251
|
+
var _a, _b;
|
|
252
|
+
if (!this.account || !transaction) {
|
|
253
|
+
throw new DynamicError('No account or transaction found');
|
|
254
|
+
}
|
|
255
|
+
const result = yield ((_b = (_a = this.getFeatures()) === null || _a === void 0 ? void 0 : _a['sui:signAndExecuteTransaction']) === null || _b === void 0 ? void 0 : _b.signAndExecuteTransaction({
|
|
256
|
+
account: this.account,
|
|
257
|
+
chain: this.account.chains[0],
|
|
258
|
+
transaction,
|
|
259
|
+
}));
|
|
260
|
+
return result;
|
|
261
|
+
}),
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
}
|
|
238
265
|
teardownEventListeners() {
|
|
239
266
|
return __awaiter(this, void 0, void 0, function* () {
|
|
240
267
|
if (this.eventsUnsubscribeHandler) {
|
package/src/index.cjs
CHANGED
|
@@ -10,6 +10,7 @@ var constants = require('./utils/constants/constants.cjs');
|
|
|
10
10
|
var SuiWalletConnector = require('./SuiWalletConnector.cjs');
|
|
11
11
|
var SuiWallet = require('./wallet/SuiWallet.cjs');
|
|
12
12
|
var isSuiWallet = require('./wallet/isSuiWallet/isSuiWallet.cjs');
|
|
13
|
+
var SuiUiTransaction = require('./utils/SuiUiTransaction/SuiUiTransaction.cjs');
|
|
13
14
|
|
|
14
15
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
15
16
|
assertPackageVersion.assertPackageVersion('@dynamic-labs/sui', _package.version);
|
|
@@ -22,4 +23,5 @@ exports.MIST_PER_SUI = constants.MIST_PER_SUI;
|
|
|
22
23
|
exports.SuiWalletConnector = SuiWalletConnector.SuiWalletConnector;
|
|
23
24
|
exports.SuiWallet = SuiWallet.SuiWallet;
|
|
24
25
|
exports.isSuiWallet = isSuiWallet.isSuiWallet;
|
|
26
|
+
exports.SuiUiTransaction = SuiUiTransaction.SuiUiTransaction;
|
|
25
27
|
exports.SuiWalletConnectors = SuiWalletConnectors;
|
package/src/index.d.ts
CHANGED
|
@@ -4,3 +4,4 @@ export { SuiWalletConnector } from './SuiWalletConnector';
|
|
|
4
4
|
export { SuiWallet } from './wallet/SuiWallet';
|
|
5
5
|
export { isSuiWallet } from './wallet/isSuiWallet';
|
|
6
6
|
export type { SuiWalletConnectorProps, SuiSendBalanceProps } from './types';
|
|
7
|
+
export { SuiUiTransaction } from './utils/SuiUiTransaction/SuiUiTransaction';
|
package/src/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export { MIST_PER_SUI } from './utils/constants/constants.js';
|
|
|
6
6
|
export { SuiWalletConnector } from './SuiWalletConnector.js';
|
|
7
7
|
export { SuiWallet } from './wallet/SuiWallet.js';
|
|
8
8
|
export { isSuiWallet } from './wallet/isSuiWallet/isSuiWallet.js';
|
|
9
|
+
export { SuiUiTransaction } from './utils/SuiUiTransaction/SuiUiTransaction.js';
|
|
9
10
|
|
|
10
11
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
11
12
|
assertPackageVersion('@dynamic-labs/sui', version);
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
|
+
|
|
6
|
+
var _tslib = require('../../../_virtual/_tslib.cjs');
|
|
7
|
+
var transactions = require('@mysten/sui/transactions');
|
|
8
|
+
var utils$1 = require('@mysten/sui/utils');
|
|
9
|
+
var utils = require('@dynamic-labs/utils');
|
|
10
|
+
var constants = require('../constants/constants.cjs');
|
|
11
|
+
|
|
12
|
+
class SuiUiTransaction {
|
|
13
|
+
constructor({ onSubmit, from, client }) {
|
|
14
|
+
this.chain = 'SUI';
|
|
15
|
+
this.data = undefined;
|
|
16
|
+
this.fee = { gas: undefined };
|
|
17
|
+
this.formatNonNativeToken = (value, decimals) => (Number(value) / Number(Math.pow(10, decimals))).toString();
|
|
18
|
+
this.from = from;
|
|
19
|
+
this.onSubmit = onSubmit;
|
|
20
|
+
this.client = client;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Fetches the gas fee for the transaction by executing a dry run of the
|
|
24
|
+
* transaction and calculating the gas used.
|
|
25
|
+
*
|
|
26
|
+
* @returns The gas fee for the transaction
|
|
27
|
+
*/
|
|
28
|
+
fetchFee() {
|
|
29
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
if (this.fee.gas)
|
|
31
|
+
return;
|
|
32
|
+
const transaction = yield this.createTransactionSafe();
|
|
33
|
+
if (!transaction) {
|
|
34
|
+
throw new Error('Could not create a valid SUI transaction, check your address and value');
|
|
35
|
+
}
|
|
36
|
+
const transactionBlock = yield transaction.build({ client: this.client });
|
|
37
|
+
const dryRunResult = yield this.client.dryRunTransactionBlock({
|
|
38
|
+
transactionBlock,
|
|
39
|
+
});
|
|
40
|
+
if (!dryRunResult) {
|
|
41
|
+
this.fee.gas = undefined;
|
|
42
|
+
throw new Error('Error accessing SUI network to calculate gas, please try again later');
|
|
43
|
+
}
|
|
44
|
+
const gasObject = dryRunResult.effects.gasUsed;
|
|
45
|
+
// net_gas_fees = computation_gas_fee + storage_gas_fee - storage_rebate
|
|
46
|
+
// https://docs.sui.io/concepts/tokenomics/gas-in-sui
|
|
47
|
+
const calculatedGas = BigInt(gasObject.computationCost) +
|
|
48
|
+
BigInt(gasObject.storageCost) -
|
|
49
|
+
BigInt(gasObject.storageRebate);
|
|
50
|
+
this.fee.gas = calculatedGas;
|
|
51
|
+
if (this.fee.gas <= BigInt(0)) {
|
|
52
|
+
this.fee.gas = undefined;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
isGasSponsored() {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
parse(input) {
|
|
60
|
+
const floatValue = parseFloat(input);
|
|
61
|
+
const mist = Math.round(floatValue * constants.MIST_PER_SUI);
|
|
62
|
+
return BigInt(mist);
|
|
63
|
+
}
|
|
64
|
+
parseNonNativeToken(input, decimals) {
|
|
65
|
+
return BigInt(Math.floor(Number(input) * Math.pow(10, decimals)));
|
|
66
|
+
}
|
|
67
|
+
format(value, { precision } = {}) {
|
|
68
|
+
const suiValue = Number(value) / constants.MIST_PER_SUI;
|
|
69
|
+
const decimalString = suiValue.toLocaleString('fullwide', {
|
|
70
|
+
maximumFractionDigits: 20,
|
|
71
|
+
minimumFractionDigits: 0,
|
|
72
|
+
useGrouping: false,
|
|
73
|
+
});
|
|
74
|
+
return utils.formatNumberText(decimalString, { precision });
|
|
75
|
+
}
|
|
76
|
+
submit() {
|
|
77
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
const sendTransaction = (yield this.createTransaction());
|
|
79
|
+
return this.onSubmit(sendTransaction);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
getBalance() {
|
|
83
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
const balance = yield this.client.getBalance({
|
|
85
|
+
coinType: '0x2::sui::SUI',
|
|
86
|
+
owner: this.from,
|
|
87
|
+
});
|
|
88
|
+
return BigInt(balance.totalBalance);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
validateAddressFormat(address) {
|
|
92
|
+
if (address === 'dyn_send_transaction.multiple_recipients') {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
return utils$1.isValidSuiAddress(address);
|
|
96
|
+
}
|
|
97
|
+
createTransaction() {
|
|
98
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
99
|
+
const { value, to } = this;
|
|
100
|
+
if (!to) {
|
|
101
|
+
throw new Error('Destination is required');
|
|
102
|
+
}
|
|
103
|
+
if (!value) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
const sendTransaction = new transactions.Transaction();
|
|
107
|
+
sendTransaction.setSender(this.from);
|
|
108
|
+
const [coin] = sendTransaction.splitCoins(sendTransaction.gas, [value]);
|
|
109
|
+
sendTransaction.transferObjects([coin], to);
|
|
110
|
+
return sendTransaction;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
createTransactionSafe() {
|
|
114
|
+
return _tslib.__awaiter(this, void 0, void 0, function* () {
|
|
115
|
+
try {
|
|
116
|
+
return yield this.createTransaction();
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
exports.SuiUiTransaction = SuiUiTransaction;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
2
|
+
import { SuiClient } from '@mysten/sui/client';
|
|
3
|
+
import { IUITransaction, IUITransactionFormatOptions } from '@dynamic-labs/types';
|
|
4
|
+
type SuiUiTransactionProps = {
|
|
5
|
+
/** SUI Address of the sender */
|
|
6
|
+
from: string;
|
|
7
|
+
/** The [SuiClient] instance, needed to estimate gas fees */
|
|
8
|
+
client: SuiClient;
|
|
9
|
+
/** The function to call when the transaction is submitted */
|
|
10
|
+
onSubmit: (transaction?: Transaction) => Promise<any>;
|
|
11
|
+
};
|
|
12
|
+
export declare class SuiUiTransaction implements IUITransaction {
|
|
13
|
+
to: string | undefined;
|
|
14
|
+
from: string;
|
|
15
|
+
value: bigint | undefined;
|
|
16
|
+
chain: string;
|
|
17
|
+
receipt: string | undefined;
|
|
18
|
+
data: undefined;
|
|
19
|
+
fee: {
|
|
20
|
+
gas: bigint | undefined;
|
|
21
|
+
};
|
|
22
|
+
nonNativeAddress?: string;
|
|
23
|
+
nonNativeDecimal?: number;
|
|
24
|
+
nonNativeValue?: bigint;
|
|
25
|
+
nativePrice?: number;
|
|
26
|
+
private onSubmit;
|
|
27
|
+
private client;
|
|
28
|
+
constructor({ onSubmit, from, client }: SuiUiTransactionProps);
|
|
29
|
+
/**
|
|
30
|
+
* Fetches the gas fee for the transaction by executing a dry run of the
|
|
31
|
+
* transaction and calculating the gas used.
|
|
32
|
+
*
|
|
33
|
+
* @returns The gas fee for the transaction
|
|
34
|
+
*/
|
|
35
|
+
fetchFee(): Promise<void>;
|
|
36
|
+
isGasSponsored(): boolean;
|
|
37
|
+
parse(input: string): bigint;
|
|
38
|
+
parseNonNativeToken(input: string, decimals: number): bigint;
|
|
39
|
+
formatNonNativeToken: (value: bigint, decimals: number) => string;
|
|
40
|
+
format(value: bigint, { precision }?: IUITransactionFormatOptions): string;
|
|
41
|
+
submit(): Promise<any>;
|
|
42
|
+
getBalance(): Promise<bigint>;
|
|
43
|
+
validateAddressFormat(address: string): boolean;
|
|
44
|
+
private createTransaction;
|
|
45
|
+
private createTransactionSafe;
|
|
46
|
+
}
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
import { __awaiter } from '../../../_virtual/_tslib.js';
|
|
3
|
+
import { Transaction } from '@mysten/sui/transactions';
|
|
4
|
+
import { isValidSuiAddress } from '@mysten/sui/utils';
|
|
5
|
+
import { formatNumberText } from '@dynamic-labs/utils';
|
|
6
|
+
import { MIST_PER_SUI } from '../constants/constants.js';
|
|
7
|
+
|
|
8
|
+
class SuiUiTransaction {
|
|
9
|
+
constructor({ onSubmit, from, client }) {
|
|
10
|
+
this.chain = 'SUI';
|
|
11
|
+
this.data = undefined;
|
|
12
|
+
this.fee = { gas: undefined };
|
|
13
|
+
this.formatNonNativeToken = (value, decimals) => (Number(value) / Number(Math.pow(10, decimals))).toString();
|
|
14
|
+
this.from = from;
|
|
15
|
+
this.onSubmit = onSubmit;
|
|
16
|
+
this.client = client;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Fetches the gas fee for the transaction by executing a dry run of the
|
|
20
|
+
* transaction and calculating the gas used.
|
|
21
|
+
*
|
|
22
|
+
* @returns The gas fee for the transaction
|
|
23
|
+
*/
|
|
24
|
+
fetchFee() {
|
|
25
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
if (this.fee.gas)
|
|
27
|
+
return;
|
|
28
|
+
const transaction = yield this.createTransactionSafe();
|
|
29
|
+
if (!transaction) {
|
|
30
|
+
throw new Error('Could not create a valid SUI transaction, check your address and value');
|
|
31
|
+
}
|
|
32
|
+
const transactionBlock = yield transaction.build({ client: this.client });
|
|
33
|
+
const dryRunResult = yield this.client.dryRunTransactionBlock({
|
|
34
|
+
transactionBlock,
|
|
35
|
+
});
|
|
36
|
+
if (!dryRunResult) {
|
|
37
|
+
this.fee.gas = undefined;
|
|
38
|
+
throw new Error('Error accessing SUI network to calculate gas, please try again later');
|
|
39
|
+
}
|
|
40
|
+
const gasObject = dryRunResult.effects.gasUsed;
|
|
41
|
+
// net_gas_fees = computation_gas_fee + storage_gas_fee - storage_rebate
|
|
42
|
+
// https://docs.sui.io/concepts/tokenomics/gas-in-sui
|
|
43
|
+
const calculatedGas = BigInt(gasObject.computationCost) +
|
|
44
|
+
BigInt(gasObject.storageCost) -
|
|
45
|
+
BigInt(gasObject.storageRebate);
|
|
46
|
+
this.fee.gas = calculatedGas;
|
|
47
|
+
if (this.fee.gas <= BigInt(0)) {
|
|
48
|
+
this.fee.gas = undefined;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
isGasSponsored() {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
parse(input) {
|
|
56
|
+
const floatValue = parseFloat(input);
|
|
57
|
+
const mist = Math.round(floatValue * MIST_PER_SUI);
|
|
58
|
+
return BigInt(mist);
|
|
59
|
+
}
|
|
60
|
+
parseNonNativeToken(input, decimals) {
|
|
61
|
+
return BigInt(Math.floor(Number(input) * Math.pow(10, decimals)));
|
|
62
|
+
}
|
|
63
|
+
format(value, { precision } = {}) {
|
|
64
|
+
const suiValue = Number(value) / MIST_PER_SUI;
|
|
65
|
+
const decimalString = suiValue.toLocaleString('fullwide', {
|
|
66
|
+
maximumFractionDigits: 20,
|
|
67
|
+
minimumFractionDigits: 0,
|
|
68
|
+
useGrouping: false,
|
|
69
|
+
});
|
|
70
|
+
return formatNumberText(decimalString, { precision });
|
|
71
|
+
}
|
|
72
|
+
submit() {
|
|
73
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
const sendTransaction = (yield this.createTransaction());
|
|
75
|
+
return this.onSubmit(sendTransaction);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
getBalance() {
|
|
79
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
+
const balance = yield this.client.getBalance({
|
|
81
|
+
coinType: '0x2::sui::SUI',
|
|
82
|
+
owner: this.from,
|
|
83
|
+
});
|
|
84
|
+
return BigInt(balance.totalBalance);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
validateAddressFormat(address) {
|
|
88
|
+
if (address === 'dyn_send_transaction.multiple_recipients') {
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
return isValidSuiAddress(address);
|
|
92
|
+
}
|
|
93
|
+
createTransaction() {
|
|
94
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
95
|
+
const { value, to } = this;
|
|
96
|
+
if (!to) {
|
|
97
|
+
throw new Error('Destination is required');
|
|
98
|
+
}
|
|
99
|
+
if (!value) {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
const sendTransaction = new Transaction();
|
|
103
|
+
sendTransaction.setSender(this.from);
|
|
104
|
+
const [coin] = sendTransaction.splitCoins(sendTransaction.gas, [value]);
|
|
105
|
+
sendTransaction.transferObjects([coin], to);
|
|
106
|
+
return sendTransaction;
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
createTransactionSafe() {
|
|
110
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
111
|
+
try {
|
|
112
|
+
return yield this.createTransaction();
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export { SuiUiTransaction };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './SuiUiTransaction';
|