@tonappchain/sdk 0.7.1-frost-test-1 → 0.7.2-gas-price-0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifacts/dev/ton/internal/build/CrossChainLayer.compiled.json +1 -1
- package/dist/artifacts/dev/ton/internal/wrappers/CrossChainLayer.d.ts +1 -12
- package/dist/artifacts/dev/ton/internal/wrappers/CrossChainLayer.js +4 -32
- package/dist/src/agnosticSdk/AbiHandler.js +1 -1
- package/dist/src/agnosticSdk/DebugHelpers.js +1 -1
- package/dist/src/agnosticSdk/HooksHandler.js +1 -1
- package/dist/src/agnosticSdk/ReplacementHelper.js +1 -3
- package/dist/src/assets/AssetFactory.js +2 -3
- package/dist/src/assets/TON.d.ts +0 -1
- package/dist/src/assets/TON.js +1 -5
- package/dist/src/errors/instances.d.ts +0 -2
- package/dist/src/errors/instances.js +2 -5
- package/dist/src/interfaces/ITONTransactionManager.d.ts +5 -4
- package/dist/src/interfaces/ITacSDK.d.ts +3 -3
- package/dist/src/sdk/Configuration.js +3 -9
- package/dist/src/sdk/LiteSequencerClient.js +4 -12
- package/dist/src/sdk/Logger.d.ts +4 -4
- package/dist/src/sdk/Logger.js +4 -12
- package/dist/src/sdk/OperationTracker.js +0 -4
- package/dist/src/sdk/Simulator.js +1 -1
- package/dist/src/sdk/TONTransactionManager.d.ts +4 -4
- package/dist/src/sdk/TONTransactionManager.js +20 -30
- package/dist/src/sdk/TacSdk.d.ts +3 -3
- package/dist/src/sdk/TacSdk.js +4 -4
- package/dist/src/sdk/TxFinalizer.js +1 -6
- package/dist/src/sdk/Utils.d.ts +2 -2
- package/dist/src/sdk/Utils.js +27 -28
- package/dist/src/sender/SenderFactory.js +1 -1
- package/dist/src/sender/TonConnectSender.js +1 -1
- package/dist/src/structs/InternalStruct.d.ts +0 -5
- package/dist/src/structs/Struct.d.ts +3 -19
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{ "hash": "
|
|
1
|
+
{ "hash": "2f7a13d127de8b3a847392fe6d2e2a7008ea740706d0b3e8865c0c0865ef36fd", "hashBase64": "L3oT0SfeizqEc5L+bS4qcAjqdAcG0LPohlwMCGXvNv0=", "hex": "b5ee9c7241022e01000e14000114ff00f4a413f4bcf2c80b0102016202240168d0eda2edfb20c700925f04e001d0d3030171b0925f04e0fa40fa4031fa0031f401fa0031fa00013170f83a02d31f0101d33f01120301fced44d0fa4001f861fa4001f862fa4001f863d401d0fa0001f86cfa0001f86bfa0030f86dd401f86ed430d0d32f01f86ad32f01f866d32f01f867d32f01f868d32f01f869d30301f864f40430f8655365a1f845f80701830cf94130f8075003a101a655820086e65003a0128209e1338070f8370170f836a066b608a1a6640403fe5166a122821048e660b5ba8e5a6c7181193c70f8365cbcf2e064f84d59a1a0f86df845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed54e02282106c582059bae3002282100e50d313bae302303435050a1302fe03d31ffa00f404fa4055302170547000246ec0008e156c3101d0d300fa00fa0023963403fa0030039130e29134e255027f266ec000f84cf84b5007a816a05240b915b0927034de5320a022a027a02e81354470f836a0a052c0be5240b0e30210365f06288014fb02c88210ae7df95b2502cb1fcb3f12cb1f22cf16c9702702060901fe3339393a3b5266a05008a05008a026a08014fb02f84d5004a0f86df845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed54216ec0009d01c8f400f84cfa02f84bfa02c992316de205c8cb1f2101cb3f0701925003cf165003fa0213f40001cf16c982106c582059017f830771800cc8cb03cb01cb0813cbff02957158cb61cc987058cb6101d0cf16e2c98010fb0021d70b01c000b3915be30ddb31080076c88210d53276db5802cb1fcb3fc970018010810082226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb0000748010810082226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb00f80fc000938100cc928064e2f2f00303ee323501fa40d4d4f828f84e52300270705003c85003cf168b02cf16ca00ccc921c8cb0113f40012f400cb00c97001f90074c8cb0212ca07cbffc9d05006c705f2e04701d7393078d721d3ff0131f8458307f40e6fa131f2e0c920d0f404f401fa40fa003020c300935b3234e30ddb3c5222a1c200f2e0640b0e1102f8280441381523d70b01c0008e64aa00814cfb70f836a0738103b582100966018070f837a0801c8127e08209e1338070f837a0a47020c88210d7b9c06e580802cb1fcb3f23cf165004fa0258cf1671fa0214cb00cb00c970c87001ca0012cccb00c9c87001cbff58cf1658fa02ccc9c8ccc9e30d218307f48e6fa56c120c0d003e306c2270c8c9c87f01ca00cccb00c9c87001cbff58cf1658fa02ccc9c8ccc9001a91a4923070e201d0028307f41602f670207f8ef6238307f47c6fa5208ee702d430d0d3ff0130fa40fa00d430d0d2000101d4f40430206e8e2e3054232080108011226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb008e90c802d012cf162310355980108011db3ce2019213a09414a04313e2029132e201b30f1000a28e4dc85801cb055005cf165003fa0254712323ed41ed43ed44ed45ed479f5bc85003cf17c913775003cb6bcccced67ed65ed64ed63ed61747fed11987601cb6bcc01cf17ed41edf101f2ffc901fb00db060008e6306c1201faf845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5482100e50d31350047f830771800cc8cb03cb01cb0813cbff02957158cb61cc987058cb6101d0cf16e2c98010fb0014a101a1f84d5210be1200a6f2e0658010fb0201fa403020d70b01c000b38e3cc88210d53276db580302cb1fcb3fc970018010810082226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb00915be204ec248210cf6a5da4bae30224821023b05641bae302332382101f95f86cba8ecd135f03f84dc300f2e0c8c88210f358b6d05802cb1fcb3ff84dfa02c9f841f84d58801072226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb0070f86de031228210063199b7ba1417221a03fa3403d4f828f84e52300270705003c85003cf168b02cf16ca00ccc921c8cb0113f40012f400cb00c97001f90074c8cb0212ca07cbffc9d05005c705f2e047028014fb0202fa40308210cf6a5da4587f830771800cc8cb03cb01cb0813cbff02957158cb61cc987058cb6101d0cf16e2c98010fb0020d70b01c000b3e30f1516220078c88210ae7df95b580302cb1fcb3fc970018010810082226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb0000025b01fe34f8435210c705f2e048f823f849bef2e0ca03d3ff01f84802d32f0131f868f848f849bef2e0cb038014fb02f847f866f823f867f847f84aa0f869f823f844f84aa8a1f8458307f4866fa5908e1c01d32f013122bb9bf84552108307f45b30f865def8458307f47c6fa5e85f03c8f84901cb2fc9d0f84552408307f416f8651801c2c8500301cbff5801cb2ff84801cb2ff84601cb2ff84701cb2ff84901cb2fc9821023b05641017f830771800cc8cb03cb01cb0813cbff02957158cb61cc987058cb6101d0cf16e2c98010fb00c88210d53276db5802cb1fcb3fc9700180108100821900d8226eb32091719170e2c8500401cb055006cf165004fa02cb6a039358cc019130e201c901fb00f845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5404fa8e5432f84112c705f2e046fa0030f86bf845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed54e02282103531465cbae3022282105cec6be0bae302228210581879bcbae30222821060094a1bba1b1c1d1e00a832f84112c705f2e046fa0030f86cf845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5400a832f84112c705f2e046fa4030f863f845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5400ba32f84112c705f2e046fa4030f862f8428b02c705f2d050f845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5404f88e536c21f841c705f2e0468b02f862f845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed54e02282106a4fbe34bae30222821020faec53bae3022282107ee5a6d0bae302228210e97250b7ba1f20212300ae6c21f842c705f2e049f842f8618b02f862f845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed54002e32f84112c705f2e046d421fb0401d0ed1eed53d430ed54017c32f84112c705f2e046d430f86e6df86582107ee5a6d0c8c970830771800cc8cb03cb01cb0813cbff02957158cb61cc987058cb6101d0cf16e2c98010fb0022008cf845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed5400ca8e5532f84112c705f2e046d32f0131f86af845f844c8f84a01cb2ff84601cb2ff84701cb2ff84801cb2ff84901cb2fcb03f400c9f84ec8f84cfa02f84bfa02f84dfa02c9c8f841cf16f842cf16f843cf16ccccccc9ed54e05b8210d53276dbbadc840ff2f00201202529020158262700d9b444bda89a1f48003f0c3f48003f0c5f48003f0c7a803a1f40003f0d9f40003f0d7f40061f0dba803f0dda861a1a65e03f0d5a65e03f0cda65e03f0cfa65e03f0d1a65e03f0d3a60603f0c9e80861f0cbf083f085f087f089f08bf08df08ff091f095f093f099f097f09bf09d001f9b4817da89a1f48003f0c3f48003f0c5f48003f0c7a803a1f40003f0d9f40003f0d7f40061f0dba803f0dda861a1a65e03f0d5a65e03f0cda65e03f0cfa65e03f0d1a65e03f0d3a60603f0c9e80861f0cae041f08b060fe90cdf4b211c3003a65e0262a6077928d844a2212261c5f08b060fe8f8df4bd02046be07f08d0280014f847f848f849f84af8440201202a2c01ebb9685ed44d0fa4001f861fa4001f862fa4001f863d401d0fa0001f86cfa0001f86bfa0030f86dd401f86ed430d0d32f01f86ad32f01f866d32f01f867d32f01f868d32f01f869d30301f864f40430f865f828f84e120270705003c85003cf168b02cf16ca00ccc921c8cb0113f40012f400cb00c92082b00207001f90074c8cb0212ca07cbffc9d00101e9bb316ed44d0fa4001f861fa4001f862fa4001f863d401d0fa0001f86cfa0001f86bfa0030f86dd401f86ed430d0d32f01f86ad32f01f866d32f01f867d32f01f868d32f01f869d30301f864f40430f865f828f84e120270705003c85003cf168b02cf16ca00ccc921c8cb0113f40012f400cb00c982d001e7001f90074c8cb0212ca07cbffc9d0ace38ebd" }
|
|
@@ -5,7 +5,6 @@ export type CrossChainLayerConfig = {
|
|
|
5
5
|
adminAddress: string;
|
|
6
6
|
newAdminAddress?: string;
|
|
7
7
|
sequencerMultisigAddress: string;
|
|
8
|
-
groupPublicKey?: bigint;
|
|
9
8
|
maxRootsSize: number;
|
|
10
9
|
merkleRoots?: MerkleRoot[];
|
|
11
10
|
prevEpoch?: number;
|
|
@@ -26,7 +25,6 @@ export type EpochInfo = {
|
|
|
26
25
|
messageCollectEndTime: number;
|
|
27
26
|
nextVotingTime: number;
|
|
28
27
|
epochDelay: number;
|
|
29
|
-
groupPublicKey: bigint;
|
|
30
28
|
};
|
|
31
29
|
export type ExecutorData = {
|
|
32
30
|
address: Address;
|
|
@@ -59,7 +57,6 @@ export declare const CrossChainLayerOpCodes: {
|
|
|
59
57
|
newAdmin_confirmChangingAdminAddress: number;
|
|
60
58
|
sequencerMultisig_changeSequencerMultisigAddress: number;
|
|
61
59
|
sequencerMultisig_updateMerkleRoot: number;
|
|
62
|
-
sequencerMultisig_updateGroupPublicKey: number;
|
|
63
60
|
};
|
|
64
61
|
export declare const CrossChainLayerErrors: {
|
|
65
62
|
noErrors: number;
|
|
@@ -76,9 +73,6 @@ export declare const CrossChainLayerErrors: {
|
|
|
76
73
|
votingNotActive: number;
|
|
77
74
|
messageCollectEndTimeLow: number;
|
|
78
75
|
notEnoughProtocolFee: number;
|
|
79
|
-
messageCollectEndTimeHigh: number;
|
|
80
|
-
invalidSenderSignature: number;
|
|
81
|
-
unknownOp: number;
|
|
82
76
|
};
|
|
83
77
|
export declare function crossChainLayerConfigToCell(config: CrossChainLayerConfig): Cell;
|
|
84
78
|
export declare class CrossChainLayer implements Contract {
|
|
@@ -117,12 +111,7 @@ export declare class CrossChainLayer implements Contract {
|
|
|
117
111
|
payload: Cell;
|
|
118
112
|
responseAddress: Address;
|
|
119
113
|
}): Promise<void>;
|
|
120
|
-
|
|
121
|
-
queryId?: number;
|
|
122
|
-
groupPublicKey: bigint;
|
|
123
|
-
}): Promise<void>;
|
|
124
|
-
buildSignedUpdateMerkleRoot(secretKey: Buffer, merkleRoot: bigint, messageCollectEndTime: number): Cell;
|
|
125
|
-
sendUpdateMerkleRoot(provider: ContractProvider, secretKey: Buffer, opts: {
|
|
114
|
+
sendUpdateMerkleRoot(provider: ContractProvider, via: Sender, value: bigint, opts: {
|
|
126
115
|
queryId?: number;
|
|
127
116
|
merkleRoot: bigint;
|
|
128
117
|
messageCollectEndTime: number;
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CrossChainLayer = exports.CrossChainLayerErrors = exports.CrossChainLayerOpCodes = exports.MsgType = void 0;
|
|
4
4
|
exports.crossChainLayerConfigToCell = crossChainLayerConfigToCell;
|
|
5
5
|
const core_1 = require("@ton/core");
|
|
6
|
-
const crypto_1 = require("@ton/crypto");
|
|
7
6
|
const Constants_1 = require("./Constants");
|
|
8
7
|
const GasUtils_1 = require("./utils/GasUtils");
|
|
9
8
|
const MerkleRoots_1 = require("./utils/MerkleRoots");
|
|
@@ -35,7 +34,6 @@ exports.CrossChainLayerOpCodes = {
|
|
|
35
34
|
newAdmin_confirmChangingAdminAddress: 0x6a4fbe34,
|
|
36
35
|
sequencerMultisig_changeSequencerMultisigAddress: 0x5cec6be0,
|
|
37
36
|
sequencerMultisig_updateMerkleRoot: 0x23b05641,
|
|
38
|
-
sequencerMultisig_updateGroupPublicKey: 0xda524dc5,
|
|
39
37
|
};
|
|
40
38
|
exports.CrossChainLayerErrors = {
|
|
41
39
|
noErrors: 0,
|
|
@@ -52,9 +50,6 @@ exports.CrossChainLayerErrors = {
|
|
|
52
50
|
votingNotActive: 202,
|
|
53
51
|
messageCollectEndTimeLow: 203,
|
|
54
52
|
notEnoughProtocolFee: 204,
|
|
55
|
-
messageCollectEndTimeHigh: 205,
|
|
56
|
-
invalidSenderSignature: 32,
|
|
57
|
-
unknownOp: 0xfffff,
|
|
58
53
|
};
|
|
59
54
|
function crossChainLayerConfigToCell(config) {
|
|
60
55
|
return (0, core_1.beginCell)()
|
|
@@ -62,9 +57,6 @@ function crossChainLayerConfigToCell(config) {
|
|
|
62
57
|
.storeAddress(config.newAdminAddress ? core_1.Address.parse(config.newAdminAddress) : null)
|
|
63
58
|
.storeAddress(core_1.Address.parse(config.sequencerMultisigAddress))
|
|
64
59
|
.storeRef((0, core_1.beginCell)()
|
|
65
|
-
.storeUint(config.groupPublicKey ? config.groupPublicKey : 0n, Constants_1.Params.bitsize.hash)
|
|
66
|
-
.endCell())
|
|
67
|
-
.storeRef((0, core_1.beginCell)()
|
|
68
60
|
.storeCoins(config.tacProtocolFee ? (0, core_1.toNano)(config.tacProtocolFee.toFixed(9)) : 0)
|
|
69
61
|
.storeCoins(config.tonProtocolFee ? (0, core_1.toNano)(config.tonProtocolFee.toFixed(9)) : 0)
|
|
70
62
|
.storeCoins(config.protocolFeeSupply ? (0, core_1.toNano)(config.protocolFeeSupply.toFixed(9)) : 0)
|
|
@@ -142,34 +134,18 @@ class CrossChainLayer {
|
|
|
142
134
|
.endCell(),
|
|
143
135
|
});
|
|
144
136
|
}
|
|
145
|
-
async
|
|
137
|
+
async sendUpdateMerkleRoot(provider, via, value, opts) {
|
|
146
138
|
await provider.internal(via, {
|
|
147
139
|
value,
|
|
148
140
|
sendMode: core_1.SendMode.PAY_GAS_SEPARATELY,
|
|
149
141
|
body: (0, core_1.beginCell)()
|
|
150
|
-
.storeUint(exports.CrossChainLayerOpCodes.
|
|
142
|
+
.storeUint(exports.CrossChainLayerOpCodes.sequencerMultisig_updateMerkleRoot, Constants_1.Params.bitsize.op)
|
|
151
143
|
.storeUint(opts.queryId || 0, Constants_1.Params.bitsize.queryId)
|
|
152
|
-
.storeUint(opts.
|
|
144
|
+
.storeUint(opts.merkleRoot, Constants_1.Params.bitsize.hash)
|
|
145
|
+
.storeUint(opts.messageCollectEndTime, Constants_1.Params.bitsize.time)
|
|
153
146
|
.endCell(),
|
|
154
147
|
});
|
|
155
148
|
}
|
|
156
|
-
buildSignedUpdateMerkleRoot(secretKey, merkleRoot, messageCollectEndTime) {
|
|
157
|
-
let msg = (0, core_1.beginCell)()
|
|
158
|
-
.storeUint(merkleRoot, Constants_1.Params.bitsize.hash)
|
|
159
|
-
.storeUint(messageCollectEndTime, Constants_1.Params.bitsize.time)
|
|
160
|
-
.endCell();
|
|
161
|
-
let signature = (0, crypto_1.sign)(msg.hash(), secretKey);
|
|
162
|
-
msg = (0, core_1.beginCell)()
|
|
163
|
-
.storeUint(exports.CrossChainLayerOpCodes.sequencerMultisig_updateMerkleRoot, 32)
|
|
164
|
-
.storeBuffer(signature)
|
|
165
|
-
.storeSlice(msg.asSlice())
|
|
166
|
-
.endCell();
|
|
167
|
-
return msg;
|
|
168
|
-
}
|
|
169
|
-
async sendUpdateMerkleRoot(provider, secretKey, opts) {
|
|
170
|
-
const msg = this.buildSignedUpdateMerkleRoot(secretKey, opts.merkleRoot, opts.messageCollectEndTime);
|
|
171
|
-
await provider.external(msg);
|
|
172
|
-
}
|
|
173
149
|
async sendAddProtocolFee(provider, via, value, opts) {
|
|
174
150
|
await provider.internal(via, {
|
|
175
151
|
value,
|
|
@@ -293,7 +269,6 @@ class CrossChainLayer {
|
|
|
293
269
|
const adminAddress = result.stack.readAddress().toString();
|
|
294
270
|
const newAdminAddress = result.stack.readAddressOpt()?.toString();
|
|
295
271
|
const sequencerMultisigAddress = result.stack.readAddress().toString();
|
|
296
|
-
const groupPublicKey = result.stack.readBigNumber();
|
|
297
272
|
const maxRootsSize = result.stack.readNumber();
|
|
298
273
|
const merkleRoots = result.stack.readCellOpt();
|
|
299
274
|
const prevEpoch = result.stack.readNumber();
|
|
@@ -309,7 +284,6 @@ class CrossChainLayer {
|
|
|
309
284
|
adminAddress,
|
|
310
285
|
newAdminAddress,
|
|
311
286
|
sequencerMultisigAddress,
|
|
312
|
-
groupPublicKey,
|
|
313
287
|
maxRootsSize,
|
|
314
288
|
merkleRoots: (0, MerkleRoots_1.cellToArray)(merkleRoots),
|
|
315
289
|
prevEpoch,
|
|
@@ -332,7 +306,6 @@ class CrossChainLayer {
|
|
|
332
306
|
const nextVotingTime = result.stack.readNumber();
|
|
333
307
|
const epochDelay = result.stack.readNumber();
|
|
334
308
|
const maxRootsSize = result.stack.readNumber();
|
|
335
|
-
const groupPublicKey = result.stack.readBigNumber();
|
|
336
309
|
return {
|
|
337
310
|
lastMerkleRoot,
|
|
338
311
|
prevEpoch,
|
|
@@ -341,7 +314,6 @@ class CrossChainLayer {
|
|
|
341
314
|
nextVotingTime,
|
|
342
315
|
epochDelay,
|
|
343
316
|
maxRootsSize,
|
|
344
|
-
groupPublicKey,
|
|
345
317
|
};
|
|
346
318
|
}
|
|
347
319
|
async getExecutorAddress(provider, payload) {
|
|
@@ -56,7 +56,7 @@ class AbiHandler {
|
|
|
56
56
|
// Build parameter list with proper tuple handling
|
|
57
57
|
const params = func.inputs
|
|
58
58
|
.map((input) => {
|
|
59
|
-
|
|
59
|
+
let paramType = this._buildParameterType(input);
|
|
60
60
|
// Add parameter name if available
|
|
61
61
|
if (input.name) {
|
|
62
62
|
return `${paramType} ${input.name}`;
|
|
@@ -49,9 +49,7 @@ class ReplacementHelper {
|
|
|
49
49
|
// Find the parameter by name
|
|
50
50
|
const paramIndex = functionFragment.inputs.findIndex((input) => input.name === parameterName);
|
|
51
51
|
if (paramIndex === -1) {
|
|
52
|
-
const availableParams = functionFragment.inputs
|
|
53
|
-
.map((input) => `${input.name} (${input.type})`)
|
|
54
|
-
.join(', ');
|
|
52
|
+
const availableParams = functionFragment.inputs.map((input) => `${input.name} (${input.type})`).join(', ');
|
|
55
53
|
throw new Error(`Parameter '${parameterName}' not found in function '${functionName}'. Available parameters: ${availableParams}`);
|
|
56
54
|
}
|
|
57
55
|
// Calculate position and length based on parameter type
|
|
@@ -25,9 +25,8 @@ class AssetFactory {
|
|
|
25
25
|
return asset;
|
|
26
26
|
}
|
|
27
27
|
static async createFTAsset(configuration, address) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return ton;
|
|
28
|
+
if (address === configuration.nativeTONAddress || address === '') {
|
|
29
|
+
return TON_1.TON.create(configuration);
|
|
31
30
|
}
|
|
32
31
|
return FT_1.FT.fromAddress(configuration, address);
|
|
33
32
|
}
|
package/dist/src/assets/TON.d.ts
CHANGED
package/dist/src/assets/TON.js
CHANGED
|
@@ -12,7 +12,6 @@ class TON {
|
|
|
12
12
|
this.address = '';
|
|
13
13
|
this._config = config;
|
|
14
14
|
this._rawAmount = 0n;
|
|
15
|
-
this.evmAddress = '';
|
|
16
15
|
}
|
|
17
16
|
static create(config) {
|
|
18
17
|
return new TON(config);
|
|
@@ -52,10 +51,7 @@ class TON {
|
|
|
52
51
|
return this;
|
|
53
52
|
}
|
|
54
53
|
async getEVMAddress() {
|
|
55
|
-
|
|
56
|
-
this.evmAddress = await this._config.TACParams.tokenUtils.computeAddress(this._config.nativeTONAddress);
|
|
57
|
-
}
|
|
58
|
-
return this.evmAddress;
|
|
54
|
+
return this._config.TACParams.tokenUtils.computeAddress(this._config.nativeTONAddress);
|
|
59
55
|
}
|
|
60
56
|
async getTVMAddress() {
|
|
61
57
|
return '';
|
|
@@ -30,5 +30,3 @@ export declare const missingGasLimitError: FormatError;
|
|
|
30
30
|
export declare const missingDecimals: MetadataError;
|
|
31
31
|
export declare const missingJettonDataError: MetadataError;
|
|
32
32
|
export declare const zeroRawAmountError: (assetAddress: string) => TokenError;
|
|
33
|
-
export declare const sendCrossChainTransactionFailedError: (msg: string) => WalletError;
|
|
34
|
-
export declare const convertCurrencyNegativeOrZeroValueError: FormatError;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.zeroRawAmountError = exports.missingJettonDataError = exports.missingDecimals = exports.missingGasLimitError = exports.missingTvmExecutorFeeError = exports.missingFeeParamsError = exports.getTONFeeInfoFetchError = exports.simulationFetchError = exports.convertCurrencyFetchError = exports.indexRequiredError = exports.unknownTokenTypeError = exports.insufficientBalanceError = exports.allContractOpenerFailedError = exports.allEndpointsFailedError = exports.noValidGroupFoundError = exports.prepareMessageGroupError = exports.invalidAssetType = exports.emptyArrayError = exports.profilingFetchError = exports.invalidMethodNameError = exports.emptySettingError = exports.prefixError = exports.notMultiplyOf8Error = exports.unsupportedFormatError = exports.unsupportedKeyError = exports.unknownWalletError = exports.evmAddressError = exports.tvmAddressError = exports.statusFetchError = exports.operationFetchError = exports.emptyContractError = void 0;
|
|
4
4
|
const errors_1 = require("./errors");
|
|
5
5
|
exports.emptyContractError = new errors_1.ContractError('unexpected empty contract code of given jetton.', 100);
|
|
6
6
|
const operationFetchError = (msg, inner) => new errors_1.FetchError(`failed to fetch OperationId: ${msg}`, 101, inner);
|
|
@@ -30,7 +30,7 @@ exports.invalidAssetType = new errors_1.FormatError('Invalid asset type', 114);
|
|
|
30
30
|
const prepareMessageGroupError = (isBocSizeValid, isDepthValid) => new errors_1.PrepareMessageGroupError(`Failed to prepare message group: BOC size valid: ${isBocSizeValid}, depth valid: ${isDepthValid}`, 115);
|
|
31
31
|
exports.prepareMessageGroupError = prepareMessageGroupError;
|
|
32
32
|
exports.noValidGroupFoundError = new errors_1.NoValidGroupFoundError('Failed to prepare valid message group', 116);
|
|
33
|
-
const allEndpointsFailedError = (inner) => new errors_1.FetchError('All endpoints failed
|
|
33
|
+
const allEndpointsFailedError = (inner) => new errors_1.FetchError('All endpoints failed', 117, inner);
|
|
34
34
|
exports.allEndpointsFailedError = allEndpointsFailedError;
|
|
35
35
|
const allContractOpenerFailedError = (inner) => new errors_1.FetchError('All contract opener failed', 118, inner);
|
|
36
36
|
exports.allContractOpenerFailedError = allContractOpenerFailedError;
|
|
@@ -53,6 +53,3 @@ exports.missingDecimals = new errors_1.MetadataError('Missing decimals in jetton
|
|
|
53
53
|
exports.missingJettonDataError = new errors_1.MetadataError('Jetton data should be available for TON origin', 129);
|
|
54
54
|
const zeroRawAmountError = (assetAddress) => new errors_1.TokenError(`FT asset with zero rawAmount/amount is not allowed: ${assetAddress}`, 130);
|
|
55
55
|
exports.zeroRawAmountError = zeroRawAmountError;
|
|
56
|
-
const sendCrossChainTransactionFailedError = (msg) => new errors_1.WalletError(`failed to send cross chain transaction: ${msg}`, 131);
|
|
57
|
-
exports.sendCrossChainTransactionFailedError = sendCrossChainTransactionFailedError;
|
|
58
|
-
exports.convertCurrencyNegativeOrZeroValueError = new errors_1.FormatError('Value cannot be negative or zero for currency conversion', 132);
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import type { SenderAbstraction } from '../sender';
|
|
2
|
-
import {
|
|
2
|
+
import { CrosschainTx, EvmProxyMsg, OperationIdsByShardsKey, TransactionLinkerWithOperationId, WaitOptions } from '../structs/Struct';
|
|
3
3
|
export interface ITONTransactionManager {
|
|
4
4
|
/**
|
|
5
5
|
* Sends a single cross-chain transaction.
|
|
6
6
|
* @param evmProxyMsg Encoded EVM proxy message to bridge.
|
|
7
7
|
* @param sender Sender abstraction for TVM message sending.
|
|
8
8
|
* @param tx cross-chain transaction to bridge.
|
|
9
|
+
* @param waitOptions Optional policy to wait for operation id resolution.
|
|
9
10
|
* @returns Transaction linker with operation id for tracking.
|
|
10
11
|
*/
|
|
11
|
-
sendCrossChainTransaction(evmProxyMsg: EvmProxyMsg, sender: SenderAbstraction, tx: CrosschainTx): Promise<TransactionLinkerWithOperationId>;
|
|
12
|
+
sendCrossChainTransaction(evmProxyMsg: EvmProxyMsg, sender: SenderAbstraction, tx: CrosschainTx, waitOptions?: WaitOptions<string>): Promise<TransactionLinkerWithOperationId>;
|
|
12
13
|
/**
|
|
13
14
|
* Sends multiple cross-chain transactions in a batch.
|
|
14
15
|
* @param sender Sender abstraction for TVM message sending.
|
|
15
16
|
* @param txs List of cross-chain transactions to bridge.
|
|
16
|
-
* @param
|
|
17
|
+
* @param waitOptions Optional policy for waiting on operation ids by shard keys.
|
|
17
18
|
* @returns Array of transaction linkers, one per submitted transaction.
|
|
18
19
|
*/
|
|
19
|
-
sendCrossChainTransactions(sender: SenderAbstraction, txs:
|
|
20
|
+
sendCrossChainTransactions(sender: SenderAbstraction, txs: CrosschainTx[], waitOptions?: WaitOptions<OperationIdsByShardsKey>): Promise<TransactionLinkerWithOperationId[]>;
|
|
20
21
|
}
|
|
@@ -2,7 +2,7 @@ import { Wallet } from 'ethers';
|
|
|
2
2
|
import { JettonMinterData, NFTItemData } from '../../artifacts/tonTypes';
|
|
3
3
|
import { FT, NFT } from '../assets';
|
|
4
4
|
import type { SenderAbstraction } from '../sender';
|
|
5
|
-
import { AssetFromFTArg, AssetFromNFTCollectionArg, AssetFromNFTItemArg, AssetLike,
|
|
5
|
+
import { AssetFromFTArg, AssetFromNFTCollectionArg, AssetFromNFTItemArg, AssetLike, CrossChainTransactionOptions, CrosschainTx, CrosschainTxWithAssetLike, EVMAddress, EvmProxyMsg, ExecutionFeeEstimationResult, NFTAddressType, OperationIdsByShardsKey, SuggestedTVMExecutorFee, TACSimulationParams, TACSimulationResult, TransactionLinkerWithOperationId, TVMAddress, UserWalletBalanceExtended, WaitOptions } from '../structs/Struct';
|
|
6
6
|
import { Asset } from './Asset';
|
|
7
7
|
import { IConfiguration } from './IConfiguration';
|
|
8
8
|
import { IOperationTracker } from './IOperationTracker';
|
|
@@ -98,10 +98,10 @@ export interface ITacSDK {
|
|
|
98
98
|
* Sends multiple cross-chain transactions in one batch and optionally waits for tracking info.
|
|
99
99
|
* @param sender Sender abstraction for signing/sending TVM messages.
|
|
100
100
|
* @param txs Array of cross-chain transactions to broadcast.
|
|
101
|
-
* @param
|
|
101
|
+
* @param waitOptions Optional waiting policy for operation ids by shard keys.
|
|
102
102
|
* @returns Promise with an array of TransactionLinkerWithOperationId for each submitted transaction.
|
|
103
103
|
*/
|
|
104
|
-
sendCrossChainTransactions(sender: SenderAbstraction, txs:
|
|
104
|
+
sendCrossChainTransactions(sender: SenderAbstraction, txs: CrosschainTxWithAssetLike[], waitOptions?: WaitOptions<OperationIdsByShardsKey>): Promise<TransactionLinkerWithOperationId[]>;
|
|
105
105
|
/**
|
|
106
106
|
* Bridges tokens/value from EVM to TON chain via the executor.
|
|
107
107
|
* @param signer Ethers Wallet used to sign the EVM-side transaction.
|
|
@@ -78,7 +78,6 @@ class Configuration {
|
|
|
78
78
|
const artifacts = network === Struct_1.Network.MAINNET ? artifacts_1.mainnet : network === Struct_1.Network.TESTNET ? artifacts_1.testnet : artifacts_1.dev;
|
|
79
79
|
let provider;
|
|
80
80
|
let settingsAddress;
|
|
81
|
-
let saFactoryAddress;
|
|
82
81
|
if (network === Struct_1.Network.DEV) {
|
|
83
82
|
if (!TACParams || !TACParams.provider) {
|
|
84
83
|
throw new Error('For dev network, a custom provider must be provided in TACParams');
|
|
@@ -87,16 +86,11 @@ class Configuration {
|
|
|
87
86
|
if (!TACParams.settingsAddress) {
|
|
88
87
|
throw new Error('For dev network, a custom settings address must be provided in TACParams');
|
|
89
88
|
}
|
|
90
|
-
settingsAddress = TACParams.settingsAddress;
|
|
91
|
-
if (!TACParams.saFactoryAddress) {
|
|
92
|
-
throw new Error('For dev network, a custom smart account factory address must be provided in TACParams');
|
|
93
|
-
}
|
|
94
|
-
saFactoryAddress = TACParams.saFactoryAddress;
|
|
89
|
+
settingsAddress = TACParams.settingsAddress.toString();
|
|
95
90
|
}
|
|
96
91
|
else {
|
|
97
92
|
provider = TACParams?.provider ?? ethers_1.ethers.getDefaultProvider(artifacts.TAC_RPC_ENDPOINT);
|
|
98
|
-
settingsAddress = TACParams?.settingsAddress ?? artifacts.TAC_SETTINGS_ADDRESS;
|
|
99
|
-
saFactoryAddress = TACParams?.saFactoryAddress ?? artifacts.TAC_SMART_ACCOUNT_FACTORY_ADDRESS;
|
|
93
|
+
settingsAddress = TACParams?.settingsAddress?.toString() ?? artifacts.TAC_SETTINGS_ADDRESS;
|
|
100
94
|
}
|
|
101
95
|
Validator_1.Validator.validateEVMAddress(settingsAddress);
|
|
102
96
|
const settingsAbi = artifacts.tac.compilationArtifacts.ISettings.abi;
|
|
@@ -123,7 +117,7 @@ class Configuration {
|
|
|
123
117
|
const tokenUtilsAbi = artifacts.tac.compilationArtifacts.ITokenUtils.abi;
|
|
124
118
|
const tokenUtils = new ethers_1.ethers.Contract(tokenUtilsAddress, tokenUtilsAbi, provider);
|
|
125
119
|
const TacSAFactoryAbi = artifacts.tac.compilationArtifacts.ISAFactory.abi;
|
|
126
|
-
const smartAccountFactory = new ethers_1.ethers.Contract(
|
|
120
|
+
const smartAccountFactory = new ethers_1.ethers.Contract(artifacts.TAC_SMART_ACCOUNT_FACTORY_ADDRESS, TacSAFactoryAbi, provider);
|
|
127
121
|
return {
|
|
128
122
|
provider,
|
|
129
123
|
settings,
|
|
@@ -15,18 +15,10 @@ class LiteSequencerClient {
|
|
|
15
15
|
const isEthHash = /^0x[a-fA-F0-9]{64}$/.test(transactionHash);
|
|
16
16
|
const path = isEthHash ? 'tac/operation-id' : 'ton/operation-id';
|
|
17
17
|
try {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
return response.data.response?.operationId || '';
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
const response = await this.httpClient.get(new URL(path, this.endpoint).toString(), {
|
|
26
|
-
params: { transactionHash },
|
|
27
|
-
});
|
|
28
|
-
return response.data.response || '';
|
|
29
|
-
}
|
|
18
|
+
const response = await this.httpClient.get(new URL(path, this.endpoint).toString(), {
|
|
19
|
+
params: { transactionHash },
|
|
20
|
+
});
|
|
21
|
+
return response.data.response || '';
|
|
30
22
|
}
|
|
31
23
|
catch (error) {
|
|
32
24
|
if (error?.response?.status === 404) {
|
package/dist/src/sdk/Logger.d.ts
CHANGED
|
@@ -6,8 +6,8 @@ export declare class ConsoleLogger implements ILogger {
|
|
|
6
6
|
error(...arg: unknown[]): void;
|
|
7
7
|
}
|
|
8
8
|
export declare class NoopLogger implements ILogger {
|
|
9
|
-
debug(
|
|
10
|
-
info(
|
|
11
|
-
warn(
|
|
12
|
-
error(
|
|
9
|
+
debug(): void;
|
|
10
|
+
info(): void;
|
|
11
|
+
warn(): void;
|
|
12
|
+
error(): void;
|
|
13
13
|
}
|
package/dist/src/sdk/Logger.js
CHANGED
|
@@ -17,17 +17,9 @@ class ConsoleLogger {
|
|
|
17
17
|
}
|
|
18
18
|
exports.ConsoleLogger = ConsoleLogger;
|
|
19
19
|
class NoopLogger {
|
|
20
|
-
debug(
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
void _arg;
|
|
25
|
-
}
|
|
26
|
-
warn(..._arg) {
|
|
27
|
-
void _arg;
|
|
28
|
-
}
|
|
29
|
-
error(..._arg) {
|
|
30
|
-
void _arg;
|
|
31
|
-
}
|
|
20
|
+
debug() { }
|
|
21
|
+
info() { }
|
|
22
|
+
warn() { }
|
|
23
|
+
error() { }
|
|
32
24
|
}
|
|
33
25
|
exports.NoopLogger = NoopLogger;
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.OperationTracker = exports.DefaultLiteSequencerClientFactory = void 0;
|
|
4
4
|
const artifacts_1 = require("../../artifacts");
|
|
5
5
|
const errors_1 = require("../errors");
|
|
6
|
-
const instances_1 = require("../errors/instances");
|
|
7
6
|
const Struct_1 = require("../structs/Struct");
|
|
8
7
|
const LiteSequencerClient_1 = require("./LiteSequencerClient");
|
|
9
8
|
const Logger_1 = require("./Logger");
|
|
@@ -240,9 +239,6 @@ class OperationTracker {
|
|
|
240
239
|
return Struct_1.SimplifiedStatuses.SUCCESSFUL;
|
|
241
240
|
}
|
|
242
241
|
async convertCurrency(params, waitOptions) {
|
|
243
|
-
if (params.value <= 0n) {
|
|
244
|
-
throw instances_1.convertCurrencyNegativeOrZeroValueError;
|
|
245
|
-
}
|
|
246
242
|
this.logger.debug(`Converting currency: ${(0, Utils_1.formatObjectForLogging)(params)}`);
|
|
247
243
|
const requestFn = async () => {
|
|
248
244
|
let lastError;
|
|
@@ -27,7 +27,7 @@ class Simulator {
|
|
|
27
27
|
Validator_1.Validator.validateEVMAddress(evmProxyMsg.evmTargetAddress);
|
|
28
28
|
Validator_1.Validator.validateEVMAddresses(evmValidExecutors);
|
|
29
29
|
Validator_1.Validator.validateTVMAddresses(tvmValidExecutors);
|
|
30
|
-
const aggregatedData = (0, Utils_1.aggregateTokens)(assets);
|
|
30
|
+
const aggregatedData = await (0, Utils_1.aggregateTokens)(assets);
|
|
31
31
|
const shardCount = aggregatedData.jettons.length || 1;
|
|
32
32
|
const transactionLinker = (0, Utils_1.generateTransactionLinker)(sender.getSenderAddress(), shardCount);
|
|
33
33
|
const tacSimulationParams = {
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { IConfiguration, ILogger, IOperationTracker, ISimulator, ITONTransactionManager } from '../interfaces';
|
|
2
2
|
import type { SenderAbstraction } from '../sender';
|
|
3
|
-
import {
|
|
3
|
+
import { CrosschainTx, EvmProxyMsg, OperationIdsByShardsKey, TransactionLinkerWithOperationId, WaitOptions } from '../structs/Struct';
|
|
4
4
|
export declare class TONTransactionManager implements ITONTransactionManager {
|
|
5
5
|
private readonly config;
|
|
6
6
|
private readonly simulator;
|
|
7
7
|
private readonly operationTracker;
|
|
8
8
|
private readonly logger;
|
|
9
9
|
constructor(config: IConfiguration, simulator: ISimulator, operationTracker: IOperationTracker, logger?: ILogger);
|
|
10
|
-
|
|
10
|
+
private buildFeeParams;
|
|
11
11
|
private prepareCrossChainTransaction;
|
|
12
12
|
private generateCrossChainMessages;
|
|
13
|
-
sendCrossChainTransaction(evmProxyMsg: EvmProxyMsg, sender: SenderAbstraction, tx: CrosschainTx): Promise<TransactionLinkerWithOperationId>;
|
|
14
|
-
sendCrossChainTransactions(sender: SenderAbstraction, txs:
|
|
13
|
+
sendCrossChainTransaction(evmProxyMsg: EvmProxyMsg, sender: SenderAbstraction, tx: CrosschainTx, waitOptions?: WaitOptions<string>): Promise<TransactionLinkerWithOperationId>;
|
|
14
|
+
sendCrossChainTransactions(sender: SenderAbstraction, txs: CrosschainTx[], waitOptions?: WaitOptions<OperationIdsByShardsKey>): Promise<TransactionLinkerWithOperationId[]>;
|
|
15
15
|
private prepareBatchTransactions;
|
|
16
16
|
private waitForOperationIds;
|
|
17
17
|
}
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.TONTransactionManager = void 0;
|
|
4
4
|
const assets_1 = require("../assets");
|
|
5
5
|
const errors_1 = require("../errors");
|
|
6
|
-
const instances_1 = require("../errors/instances");
|
|
7
6
|
const Consts_1 = require("./Consts");
|
|
8
7
|
const Logger_1 = require("./Logger");
|
|
9
8
|
const Utils_1 = require("./Utils");
|
|
@@ -54,7 +53,7 @@ class TONTransactionManager {
|
|
|
54
53
|
const { allowSimulationError = false, isRoundTrip = undefined, calculateRollbackFee = true, validateAssetsBalance = true, } = options || {};
|
|
55
54
|
const { evmValidExecutors = [], tvmValidExecutors = [] } = options || {};
|
|
56
55
|
Validator_1.Validator.validateEVMAddress(evmProxyMsg.evmTargetAddress);
|
|
57
|
-
const aggregatedData = (0, Utils_1.aggregateTokens)(assets);
|
|
56
|
+
const aggregatedData = await (0, Utils_1.aggregateTokens)(assets);
|
|
58
57
|
Validator_1.Validator.validateEVMAddresses(evmValidExecutors);
|
|
59
58
|
Validator_1.Validator.validateTVMAddresses(tvmValidExecutors);
|
|
60
59
|
const shouldValidateAssets = validateAssetsBalance && !skipAssetsBalanceValidation;
|
|
@@ -137,44 +136,35 @@ class TONTransactionManager {
|
|
|
137
136
|
this.logger.debug('Cross-chain messages generated successfully');
|
|
138
137
|
return messages;
|
|
139
138
|
}
|
|
140
|
-
async sendCrossChainTransaction(evmProxyMsg, sender, tx) {
|
|
139
|
+
async sendCrossChainTransaction(evmProxyMsg, sender, tx, waitOptions) {
|
|
141
140
|
const { transaction, transactionLinker } = await this.prepareCrossChainTransaction(evmProxyMsg, sender, tx.assets, tx.options);
|
|
142
141
|
await assets_1.TON.checkBalance(sender, this.config, [transaction]);
|
|
143
142
|
this.logger.debug(`Sending transaction: ${(0, Utils_1.formatObjectForLogging)(transactionLinker)}`);
|
|
144
143
|
const sendTransactionResult = await sender.sendShardTransaction(transaction, this.config.network, this.config.TONParams.contractOpener);
|
|
145
|
-
if (!
|
|
146
|
-
throw (0, instances_1.sendCrossChainTransactionFailedError)(sendTransactionResult.error?.message ?? 'Transaction failed to send');
|
|
147
|
-
}
|
|
148
|
-
const shouldWaitForOperationId = tx.options?.waitOperationId ?? true;
|
|
149
|
-
if (!shouldWaitForOperationId) {
|
|
144
|
+
if (!waitOptions) {
|
|
150
145
|
return { sendTransactionResult, ...transactionLinker };
|
|
151
146
|
}
|
|
152
|
-
const waitOptions = tx.options?.waitOptions ?? {};
|
|
153
|
-
waitOptions.successCheck = waitOptions.successCheck ?? ((id) => !!id);
|
|
154
|
-
waitOptions.logger = waitOptions.logger ?? this.logger;
|
|
155
147
|
const operationId = await this.operationTracker
|
|
156
|
-
.getOperationId(transactionLinker,
|
|
148
|
+
.getOperationId(transactionLinker, {
|
|
149
|
+
...waitOptions,
|
|
150
|
+
successCheck: (id) => !!id,
|
|
151
|
+
logger: this.logger,
|
|
152
|
+
})
|
|
157
153
|
.catch((error) => {
|
|
158
154
|
this.logger.error(`Error while waiting for operation ID: ${error}`);
|
|
159
155
|
return undefined;
|
|
160
156
|
});
|
|
161
157
|
return { sendTransactionResult, operationId, ...transactionLinker };
|
|
162
158
|
}
|
|
163
|
-
async sendCrossChainTransactions(sender, txs,
|
|
159
|
+
async sendCrossChainTransactions(sender, txs, waitOptions) {
|
|
164
160
|
const caller = sender.getSenderAddress();
|
|
165
161
|
this.logger.debug(`Preparing ${txs.length} cross-chain transactions for ${caller}`);
|
|
166
162
|
const { transactions, transactionLinkers } = await this.prepareBatchTransactions(txs, sender);
|
|
167
163
|
await assets_1.TON.checkBalance(sender, this.config, transactions);
|
|
168
164
|
this.logger.debug(`Sending transactions: ${(0, Utils_1.formatObjectForLogging)(transactionLinkers)}`);
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
throw (0, instances_1.sendCrossChainTransactionFailedError)(result.error?.message ?? 'Transaction failed to send');
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
const shouldWaitForOperationIds = options?.waitOperationIds ?? true;
|
|
176
|
-
return shouldWaitForOperationIds
|
|
177
|
-
? await this.waitForOperationIds(transactionLinkers, caller, options?.waitOptions ?? {})
|
|
165
|
+
await sender.sendShardTransactions(transactions, this.config.network, this.config.TONParams.contractOpener);
|
|
166
|
+
return waitOptions
|
|
167
|
+
? await this.waitForOperationIds(transactionLinkers, caller, waitOptions)
|
|
178
168
|
: transactionLinkers;
|
|
179
169
|
}
|
|
180
170
|
async prepareBatchTransactions(txs, sender) {
|
|
@@ -183,7 +173,7 @@ class TONTransactionManager {
|
|
|
183
173
|
if (txsRequiringValidation.length) {
|
|
184
174
|
// Aggregate only assets from txs that require validation and validate once per unique asset
|
|
185
175
|
const assetsToValidate = txsRequiringValidation.flatMap((tx) => tx.assets ?? []);
|
|
186
|
-
const aggregatedData = (0, Utils_1.aggregateTokens)(assetsToValidate);
|
|
176
|
+
const aggregatedData = await (0, Utils_1.aggregateTokens)(assetsToValidate);
|
|
187
177
|
await Promise.all([
|
|
188
178
|
...aggregatedData.jettons.map((jetton) => jetton.checkCanBeTransferredBy(caller)),
|
|
189
179
|
...aggregatedData.nfts.map((nft) => nft.checkCanBeTransferredBy(caller)),
|
|
@@ -199,16 +189,16 @@ class TONTransactionManager {
|
|
|
199
189
|
async waitForOperationIds(transactionLinkers, caller, waitOptions) {
|
|
200
190
|
this.logger.debug(`Waiting for operation IDs`);
|
|
201
191
|
try {
|
|
202
|
-
|
|
203
|
-
waitOptions
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
192
|
+
const operationIds = await this.operationTracker.getOperationIdsByShardsKeys(transactionLinkers.map((linker) => linker.shardsKey), caller, {
|
|
193
|
+
...waitOptions,
|
|
194
|
+
logger: this.logger,
|
|
195
|
+
successCheck: (operationIds) => Object.keys(operationIds).length == transactionLinkers.length &&
|
|
196
|
+
Object.values(operationIds).every((ids) => ids.operationIds.length > 0),
|
|
197
|
+
});
|
|
208
198
|
this.logger.debug(`Operation IDs: ${(0, Utils_1.formatObjectForLogging)(operationIds)}`);
|
|
209
199
|
return transactionLinkers.map((linker) => ({
|
|
210
200
|
...linker,
|
|
211
|
-
operationId: operationIds[linker.shardsKey].operationIds
|
|
201
|
+
operationId: operationIds[linker.shardsKey].operationIds.at(0),
|
|
212
202
|
}));
|
|
213
203
|
}
|
|
214
204
|
catch (error) {
|
package/dist/src/sdk/TacSdk.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { JettonMinterData, NFTItemData } from '../../artifacts/tonTypes';
|
|
|
3
3
|
import { FT, NFT } from '../assets';
|
|
4
4
|
import { IConfiguration, ILogger, IOperationTracker, ITacSDK } from '../interfaces';
|
|
5
5
|
import type { SenderAbstraction } from '../sender';
|
|
6
|
-
import { AssetFromFTArg, AssetFromNFTCollectionArg, AssetFromNFTItemArg, AssetLike,
|
|
6
|
+
import { AssetFromFTArg, AssetFromNFTCollectionArg, AssetFromNFTItemArg, AssetLike, CrossChainTransactionOptions, CrosschainTx, CrosschainTxWithAssetLike, EVMAddress, EvmProxyMsg, ExecutionFeeEstimationResult, NFTAddressType, OperationIdsByShardsKey, SDKParams, SuggestedTVMExecutorFee, TACSimulationParams, TACSimulationResult, TransactionLinkerWithOperationId, TVMAddress, UserWalletBalanceExtended, WaitOptions } from '../structs/Struct';
|
|
7
7
|
export declare class TacSdk implements ITacSDK {
|
|
8
8
|
readonly config: IConfiguration;
|
|
9
9
|
readonly operationTracker: IOperationTracker;
|
|
@@ -20,8 +20,8 @@ export declare class TacSdk implements ITacSDK {
|
|
|
20
20
|
get getTrustedTONExecutors(): string[];
|
|
21
21
|
getSimulationInfo(evmProxyMsg: EvmProxyMsg, sender: SenderAbstraction, assets?: AssetLike[], options?: CrossChainTransactionOptions): Promise<ExecutionFeeEstimationResult>;
|
|
22
22
|
getTVMExecutorFeeInfo(assets: AssetLike[], feeSymbol: string, tvmValidExecutors?: string[]): Promise<SuggestedTVMExecutorFee>;
|
|
23
|
-
sendCrossChainTransaction(evmProxyMsg: EvmProxyMsg, sender: SenderAbstraction, assets?: AssetLike[], options?: CrossChainTransactionOptions): Promise<TransactionLinkerWithOperationId>;
|
|
24
|
-
sendCrossChainTransactions(sender: SenderAbstraction, txs:
|
|
23
|
+
sendCrossChainTransaction(evmProxyMsg: EvmProxyMsg, sender: SenderAbstraction, assets?: AssetLike[], options?: CrossChainTransactionOptions, waitOptions?: WaitOptions<string>): Promise<TransactionLinkerWithOperationId>;
|
|
24
|
+
sendCrossChainTransactions(sender: SenderAbstraction, txs: CrosschainTxWithAssetLike[], waitOptions?: WaitOptions<OperationIdsByShardsKey>): Promise<TransactionLinkerWithOperationId[]>;
|
|
25
25
|
bridgeTokensToTON(signer: Wallet, value: bigint, tonTarget: string, assets?: AssetLike[], tvmExecutorFee?: bigint, tvmValidExecutors?: string[]): Promise<string>;
|
|
26
26
|
isContractDeployedOnTVM(address: string): Promise<boolean>;
|
|
27
27
|
simulateTACMessage(req: TACSimulationParams): Promise<TACSimulationResult>;
|
package/dist/src/sdk/TacSdk.js
CHANGED
|
@@ -77,18 +77,18 @@ class TacSdk {
|
|
|
77
77
|
};
|
|
78
78
|
return this.operationTracker.getTVMExecutorFee(params);
|
|
79
79
|
}
|
|
80
|
-
async sendCrossChainTransaction(evmProxyMsg, sender, assets = [], options) {
|
|
80
|
+
async sendCrossChainTransaction(evmProxyMsg, sender, assets = [], options, waitOptions) {
|
|
81
81
|
const normalizedAssets = await (0, Utils_1.normalizeAssets)(this.config, assets);
|
|
82
82
|
const tx = { evmProxyMsg, assets: normalizedAssets, options };
|
|
83
|
-
return this.tonTransactionManager.sendCrossChainTransaction(evmProxyMsg, sender, tx);
|
|
83
|
+
return this.tonTransactionManager.sendCrossChainTransaction(evmProxyMsg, sender, tx, waitOptions);
|
|
84
84
|
}
|
|
85
|
-
async sendCrossChainTransactions(sender, txs,
|
|
85
|
+
async sendCrossChainTransactions(sender, txs, waitOptions) {
|
|
86
86
|
const normalizedTxs = await Promise.all(txs.map(async (tx) => ({
|
|
87
87
|
evmProxyMsg: tx.evmProxyMsg,
|
|
88
88
|
options: tx.options,
|
|
89
89
|
assets: await (0, Utils_1.normalizeAssets)(this.config, tx.assets),
|
|
90
90
|
})));
|
|
91
|
-
return this.tonTransactionManager.sendCrossChainTransactions(sender, normalizedTxs,
|
|
91
|
+
return this.tonTransactionManager.sendCrossChainTransactions(sender, normalizedTxs, waitOptions);
|
|
92
92
|
}
|
|
93
93
|
async bridgeTokensToTON(signer, value, tonTarget, assets, tvmExecutorFee, tvmValidExecutors) {
|
|
94
94
|
const normalizedAssets = await (0, Utils_1.normalizeAssets)(this.config, assets);
|
|
@@ -46,9 +46,6 @@ class TonTxFinalizer {
|
|
|
46
46
|
const errorMessage = error.message;
|
|
47
47
|
// Rate limit error (429) - retry
|
|
48
48
|
if (errorMessage.includes('429')) {
|
|
49
|
-
if (i > 0) {
|
|
50
|
-
await (0, Utils_1.sleep)(delay);
|
|
51
|
-
}
|
|
52
49
|
continue;
|
|
53
50
|
}
|
|
54
51
|
// Log all errors except 404 Not Found
|
|
@@ -56,10 +53,8 @@ class TonTxFinalizer {
|
|
|
56
53
|
const logMessage = error instanceof Error ? error.message : error;
|
|
57
54
|
console.warn(`Failed to fetch adjacent transactions for ${hash}:`, logMessage);
|
|
58
55
|
}
|
|
59
|
-
if (i > 0) {
|
|
60
|
-
await (0, Utils_1.sleep)(delay);
|
|
61
|
-
}
|
|
62
56
|
}
|
|
57
|
+
await (0, Utils_1.sleep)(delay);
|
|
63
58
|
}
|
|
64
59
|
return [];
|
|
65
60
|
}
|
package/dist/src/sdk/Utils.d.ts
CHANGED
|
@@ -20,11 +20,11 @@ export declare const generateFeeData: (feeParams?: FeeParams) => Cell | undefine
|
|
|
20
20
|
export declare function waitUntilSuccess<T, TContext = unknown, A extends unknown[] = unknown[]>(options: WaitOptions<T, TContext> | undefined, operation: (...args: A) => Promise<T>, operationDescription?: string, ...args: A): Promise<T>;
|
|
21
21
|
export declare function formatObjectForLogging(obj: unknown): string;
|
|
22
22
|
export declare function getBouncedAddress(tvmAddress: string): string;
|
|
23
|
-
export declare function aggregateTokens(assets?: Asset[]): {
|
|
23
|
+
export declare function aggregateTokens(assets?: Asset[]): Promise<{
|
|
24
24
|
jettons: FT[];
|
|
25
25
|
nfts: NFT[];
|
|
26
26
|
ton?: TON;
|
|
27
|
-
}
|
|
27
|
+
}>;
|
|
28
28
|
export declare function sha256toBigInt(ContractName: string): bigint;
|
|
29
29
|
export declare function mapAssetsToTonAssets(assets: Asset[]): TONAsset[];
|
|
30
30
|
export declare function normalizeAsset(config: IConfiguration, input: AssetLike): Promise<Asset>;
|
package/dist/src/sdk/Utils.js
CHANGED
|
@@ -199,30 +199,39 @@ function getBouncedAddress(tvmAddress) {
|
|
|
199
199
|
bounceable: true,
|
|
200
200
|
});
|
|
201
201
|
}
|
|
202
|
-
function aggregateTokens(assets) {
|
|
203
|
-
const
|
|
204
|
-
const nftsMap = new Map();
|
|
202
|
+
async function aggregateTokens(assets) {
|
|
203
|
+
const uniqueAssetsMap = new Map();
|
|
205
204
|
let ton;
|
|
206
|
-
for (const asset of assets ?? []) {
|
|
207
|
-
if (asset.
|
|
205
|
+
for await (const asset of assets ?? []) {
|
|
206
|
+
if (asset.type !== Struct_1.AssetType.FT)
|
|
207
|
+
continue;
|
|
208
|
+
if (asset.rawAmount === 0n) {
|
|
208
209
|
throw (0, errors_1.zeroRawAmountError)(asset.address || 'NATIVE TON');
|
|
209
210
|
}
|
|
210
|
-
if (asset.
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
const existing = jettonsMap.get(asset.address);
|
|
216
|
-
jettonsMap.set(asset.address, (existing ? existing.addRawAmount(asset.rawAmount) : asset.clone));
|
|
217
|
-
}
|
|
211
|
+
if (!asset.address) {
|
|
212
|
+
ton = ton ? ton.addRawAmount(asset.rawAmount) : asset.clone;
|
|
213
|
+
continue;
|
|
218
214
|
}
|
|
219
|
-
|
|
220
|
-
|
|
215
|
+
let jetton = uniqueAssetsMap.get(asset.address);
|
|
216
|
+
if (!jetton) {
|
|
217
|
+
jetton = asset.clone;
|
|
221
218
|
}
|
|
219
|
+
else {
|
|
220
|
+
jetton = jetton.addRawAmount(asset.rawAmount);
|
|
221
|
+
}
|
|
222
|
+
uniqueAssetsMap.set(asset.address, jetton);
|
|
223
|
+
}
|
|
224
|
+
const jettons = Array.from(uniqueAssetsMap.values());
|
|
225
|
+
uniqueAssetsMap.clear();
|
|
226
|
+
for await (const asset of assets ?? []) {
|
|
227
|
+
if (asset.type !== Struct_1.AssetType.NFT)
|
|
228
|
+
continue;
|
|
229
|
+
uniqueAssetsMap.set(asset.address, asset.clone);
|
|
222
230
|
}
|
|
231
|
+
const nfts = Array.from(uniqueAssetsMap.values());
|
|
223
232
|
return {
|
|
224
|
-
jettons
|
|
225
|
-
nfts
|
|
233
|
+
jettons,
|
|
234
|
+
nfts,
|
|
226
235
|
ton,
|
|
227
236
|
};
|
|
228
237
|
}
|
|
@@ -231,11 +240,7 @@ function sha256toBigInt(ContractName) {
|
|
|
231
240
|
return BigInt('0x' + hash.toString('hex'));
|
|
232
241
|
}
|
|
233
242
|
function mapAssetsToTonAssets(assets) {
|
|
234
|
-
|
|
235
|
-
const result = [...jettons, ...nfts];
|
|
236
|
-
if (ton)
|
|
237
|
-
result.push(ton);
|
|
238
|
-
return result.map((asset) => ({
|
|
243
|
+
return assets.map((asset) => ({
|
|
239
244
|
amount: asset.rawAmount.toString(),
|
|
240
245
|
tokenAddress: asset.address || '',
|
|
241
246
|
assetType: asset.type,
|
|
@@ -263,15 +268,9 @@ async function normalizeAsset(config, input) {
|
|
|
263
268
|
const asset = await assets_1.AssetFactory.from(config, ftArgs);
|
|
264
269
|
const rawAmount = 'rawAmount' in input ? input.rawAmount : undefined;
|
|
265
270
|
const amount = 'amount' in input ? input.amount : 0;
|
|
266
|
-
if (!rawAmount && !amount && asset.type === Struct_1.AssetType.FT) {
|
|
267
|
-
throw (0, errors_1.zeroRawAmountError)(asset.address || 'NATIVE TON');
|
|
268
|
-
}
|
|
269
271
|
return rawAmount ? asset.withRawAmount(rawAmount) : asset.withAmount(amount);
|
|
270
272
|
}
|
|
271
273
|
catch (e) {
|
|
272
|
-
if (e instanceof errors_1.TokenError && e.errorCode === (0, errors_1.zeroRawAmountError)('').errorCode) {
|
|
273
|
-
throw e;
|
|
274
|
-
}
|
|
275
274
|
console.warn('Failed to normalize FT asset', e);
|
|
276
275
|
}
|
|
277
276
|
const itemArgs = {
|
|
@@ -38,7 +38,7 @@ class SenderFactory {
|
|
|
38
38
|
if (params.version === 'V5R1') {
|
|
39
39
|
// manual setup of wallet id required to support wallet w5 both on mainnet and testnet
|
|
40
40
|
config.walletId = {
|
|
41
|
-
networkGlobalId: params.network === Struct_1.Network.
|
|
41
|
+
networkGlobalId: params.network === Struct_1.Network.TESTNET ? -3 : -239,
|
|
42
42
|
context: {
|
|
43
43
|
walletVersion: 'v5r1',
|
|
44
44
|
workchain: 0,
|
|
@@ -28,7 +28,7 @@ class TonConnectSender {
|
|
|
28
28
|
const transaction = {
|
|
29
29
|
validUntil,
|
|
30
30
|
messages: chunk,
|
|
31
|
-
network: chain == Struct_1.Network.
|
|
31
|
+
network: chain == Struct_1.Network.TESTNET ? ui_1.CHAIN.TESTNET : ui_1.CHAIN.MAINNET,
|
|
32
32
|
};
|
|
33
33
|
try {
|
|
34
34
|
const response = await this.tonConnect.sendTransaction(transaction);
|
|
@@ -54,11 +54,6 @@ export type StageProfilingResponse = ResponseBase<ExecutionStagesByOperationId>;
|
|
|
54
54
|
export type TACSimulationResponse = ResponseBase<TACSimulationResult>;
|
|
55
55
|
export type SuggestedTVMExecutorFeeResponse = ResponseBase<SuggestedTVMExecutorFee>;
|
|
56
56
|
export type ConvertCurrencyResponse = ResponseBase<ConvertedCurrencyRawResult>;
|
|
57
|
-
export type OperationIdWithLogIndex = {
|
|
58
|
-
operationId: string;
|
|
59
|
-
logIndex: number;
|
|
60
|
-
};
|
|
61
|
-
export type OperationIdWithLogIndexResponse = ResponseBase<OperationIdWithLogIndex>;
|
|
62
57
|
export interface SendResult {
|
|
63
58
|
success: boolean;
|
|
64
59
|
result?: unknown;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SandboxContract } from '@ton/sandbox';
|
|
2
2
|
import { OpenedContract } from '@ton/ton';
|
|
3
|
-
import { AbstractProvider } from 'ethers';
|
|
3
|
+
import { AbstractProvider, Addressable } from 'ethers';
|
|
4
4
|
import { JettonMinter, JettonMinterData } from '../../artifacts/tonTypes';
|
|
5
5
|
import type { FT, NFT } from '../assets';
|
|
6
6
|
import type { Asset, ContractOpener, ILogger } from '../interfaces';
|
|
@@ -44,11 +44,7 @@ export type TACParams = {
|
|
|
44
44
|
/**
|
|
45
45
|
* Address of TAC settings contract. Use only for tests.
|
|
46
46
|
*/
|
|
47
|
-
settingsAddress?: string;
|
|
48
|
-
/**
|
|
49
|
-
* Address of TAC smart account factory contract. Use only for tests.
|
|
50
|
-
*/
|
|
51
|
-
saFactoryAddress?: string;
|
|
47
|
+
settingsAddress?: string | Addressable;
|
|
52
48
|
};
|
|
53
49
|
export type TONParams = {
|
|
54
50
|
/**
|
|
@@ -291,13 +287,6 @@ export type CrossChainTransactionOptions = {
|
|
|
291
287
|
calculateRollbackFee?: boolean;
|
|
292
288
|
withoutSimulation?: boolean;
|
|
293
289
|
validateAssetsBalance?: boolean;
|
|
294
|
-
waitOperationId?: boolean;
|
|
295
|
-
waitOptions?: WaitOptions<string>;
|
|
296
|
-
};
|
|
297
|
-
export type BatchCrossChainTransactionOptions = Omit<CrossChainTransactionOptions, 'waitOperationId' | 'waitOptions'>;
|
|
298
|
-
export type CrossChainTransactionsOptions = {
|
|
299
|
-
waitOperationIds?: boolean;
|
|
300
|
-
waitOptions?: WaitOptions<OperationIdsByShardsKey>;
|
|
301
290
|
};
|
|
302
291
|
export type ExecutionFeeEstimationResult = {
|
|
303
292
|
feeParams: FeeParams;
|
|
@@ -308,11 +297,6 @@ export type CrosschainTx = {
|
|
|
308
297
|
assets?: Asset[];
|
|
309
298
|
options?: CrossChainTransactionOptions;
|
|
310
299
|
};
|
|
311
|
-
export type BatchCrossChainTx = {
|
|
312
|
-
evmProxyMsg: EvmProxyMsg;
|
|
313
|
-
assets?: Asset[];
|
|
314
|
-
options?: BatchCrossChainTransactionOptions;
|
|
315
|
-
};
|
|
316
300
|
export type AssetLike = Asset | FT | NFT | {
|
|
317
301
|
rawAmount: bigint;
|
|
318
302
|
} | {
|
|
@@ -329,7 +313,7 @@ export type AssetLike = Asset | FT | NFT | {
|
|
|
329
313
|
address: TVMAddress | EVMAddress;
|
|
330
314
|
itemIndex: bigint;
|
|
331
315
|
};
|
|
332
|
-
export type
|
|
316
|
+
export type CrosschainTxWithAssetLike = Omit<CrosschainTx, 'assets'> & {
|
|
333
317
|
assets?: AssetLike[];
|
|
334
318
|
};
|
|
335
319
|
export interface WaitOptions<T = unknown, TContext = unknown> {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tonappchain/sdk",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.2-gas-price-0.1",
|
|
4
4
|
"repository": "https://github.com/TacBuild/tac-sdk.git",
|
|
5
5
|
"author": "TAC. <developers@tac>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"dist"
|
|
50
50
|
],
|
|
51
51
|
"scripts": {
|
|
52
|
+
"prebuild": "git submodule update --init --recursive",
|
|
52
53
|
"litebuild": "rm -rf dist && tsc --declaration",
|
|
53
54
|
"build": "rm -rf dist && npm run build:artifacts && tsc --declaration",
|
|
54
55
|
"build:artifacts:tac:dev": "cd artifacts/dev/l2-evm && npm i && npx hardhat compile && rsync -avh --delete ./artifacts ./scripts ./typechain-types ../tac/internal/",
|
|
@@ -59,7 +60,7 @@
|
|
|
59
60
|
"build:artifacts:ton:mainnet": "cd artifacts/mainnet/l1_tvm_ton && npm i && npm run compile:ts && npm run build:all && rsync -avh --delete ./build ./wrappers ../ton/internal/",
|
|
60
61
|
"build:artifacts:ton:all": "npm run build:artifacts:ton:dev && npm run build:artifacts:ton:testnet && npm run build:artifacts:ton:mainnet",
|
|
61
62
|
"build:artifacts:tac:all": "npm run build:artifacts:tac:dev && npm run build:artifacts:tac:testnet && npm run build:artifacts:tac:mainnet",
|
|
62
|
-
"build:artifacts": "npm run build:artifacts:ton:all && npm run build:artifacts:tac:all",
|
|
63
|
+
"build:artifacts": "npm run prebuild && npm run build:artifacts:ton:all && npm run build:artifacts:tac:all",
|
|
63
64
|
"test": "jest --verbose --runInBand",
|
|
64
65
|
"release": "yarn build && yarn release-it --npm.yarn1",
|
|
65
66
|
"lint": "eslint .",
|