@ton-wallet/create 14.0.2 → 14.0.4

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.
Files changed (123) hide show
  1. package/dist/client/TonClient.d.ts +228 -0
  2. package/dist/client/TonClient.js +441 -0
  3. package/dist/client/TonClient.spec.d.ts +1 -0
  4. package/dist/client/TonClient.spec.js +45 -0
  5. package/dist/client/TonClient4.d.ts +1130 -0
  6. package/dist/client/TonClient4.js +687 -0
  7. package/dist/client/TonClient4.spec.d.ts +1 -0
  8. package/dist/client/TonClient4.spec.js +42 -0
  9. package/dist/client/api/HttpApi.d.ts +764 -0
  10. package/dist/client/api/HttpApi.js +306 -0
  11. package/dist/client/api/TonCache.d.ts +16 -0
  12. package/dist/client/api/TonCache.js +33 -0
  13. package/dist/config/ConfigParser.d.ts +622 -0
  14. package/dist/config/ConfigParser.js +711 -0
  15. package/dist/config/ConfigParser.spec.d.ts +8 -0
  16. package/dist/config/ConfigParser.spec.js +97 -0
  17. package/dist/elector/ElectorContract.d.ts +51 -0
  18. package/dist/elector/ElectorContract.js +192 -0
  19. package/dist/elector/ElectorContract.spec.d.ts +8 -0
  20. package/dist/elector/ElectorContract.spec.js +104 -0
  21. package/dist/index.d.ts +33 -0
  22. package/dist/index.js +129 -0
  23. package/dist/jetton/JettonMaster.d.ts +21 -0
  24. package/dist/jetton/JettonMaster.js +39 -0
  25. package/dist/jetton/JettonMaster.spec.d.ts +8 -0
  26. package/dist/jetton/JettonMaster.spec.js +27 -0
  27. package/dist/jetton/JettonWallet.d.ts +14 -0
  28. package/dist/jetton/JettonWallet.js +27 -0
  29. package/dist/multisig/MultisigOrder.d.ts +17 -0
  30. package/dist/multisig/MultisigOrder.js +73 -0
  31. package/dist/multisig/MultisigOrder.spec.d.ts +1 -0
  32. package/dist/multisig/MultisigOrder.spec.js +139 -0
  33. package/dist/multisig/MultisigOrderBuilder.d.ts +13 -0
  34. package/dist/multisig/MultisigOrderBuilder.js +37 -0
  35. package/dist/multisig/MultisigWallet.d.ts +27 -0
  36. package/dist/multisig/MultisigWallet.js +134 -0
  37. package/dist/multisig/MultisigWallet.spec.d.ts +1 -0
  38. package/dist/multisig/MultisigWallet.spec.js +248 -0
  39. package/dist/utils/createTestClient.d.ts +9 -0
  40. package/dist/utils/createTestClient.js +18 -0
  41. package/dist/utils/createTestClient4.d.ts +9 -0
  42. package/dist/utils/createTestClient4.js +15 -0
  43. package/dist/utils/fees.d.ts +25 -0
  44. package/dist/utils/fees.js +105 -0
  45. package/dist/utils/fees.spec.d.ts +1 -0
  46. package/dist/utils/fees.spec.js +83 -0
  47. package/dist/utils/maybe.d.ts +8 -0
  48. package/dist/utils/maybe.js +9 -0
  49. package/dist/utils/randomTestKey.d.ts +8 -0
  50. package/dist/utils/randomTestKey.js +24 -0
  51. package/dist/utils/time.d.ts +15 -0
  52. package/dist/utils/time.js +63 -0
  53. package/dist/utils/toUrlSafe.d.ts +8 -0
  54. package/dist/utils/toUrlSafe.js +23 -0
  55. package/dist/wallets/WalletContractV1R1.d.ts +58 -0
  56. package/dist/wallets/WalletContractV1R1.js +100 -0
  57. package/dist/wallets/WalletContractV1R1.spec.d.ts +8 -0
  58. package/dist/wallets/WalletContractV1R1.spec.js +44 -0
  59. package/dist/wallets/WalletContractV1R2.d.ts +58 -0
  60. package/dist/wallets/WalletContractV1R2.js +101 -0
  61. package/dist/wallets/WalletContractV1R2.spec.d.ts +8 -0
  62. package/dist/wallets/WalletContractV1R2.spec.js +44 -0
  63. package/dist/wallets/WalletContractV1R3.d.ts +58 -0
  64. package/dist/wallets/WalletContractV1R3.js +101 -0
  65. package/dist/wallets/WalletContractV1R3.spec.d.ts +8 -0
  66. package/dist/wallets/WalletContractV1R3.spec.js +44 -0
  67. package/dist/wallets/WalletContractV2R1.d.ts +60 -0
  68. package/dist/wallets/WalletContractV2R1.js +102 -0
  69. package/dist/wallets/WalletContractV2R1.spec.d.ts +8 -0
  70. package/dist/wallets/WalletContractV2R1.spec.js +44 -0
  71. package/dist/wallets/WalletContractV2R2.d.ts +60 -0
  72. package/dist/wallets/WalletContractV2R2.js +102 -0
  73. package/dist/wallets/WalletContractV2R2.spec.d.ts +8 -0
  74. package/dist/wallets/WalletContractV2R2.spec.js +44 -0
  75. package/dist/wallets/WalletContractV3R1.d.ts +57 -0
  76. package/dist/wallets/WalletContractV3R1.js +104 -0
  77. package/dist/wallets/WalletContractV3R1.spec.d.ts +8 -0
  78. package/dist/wallets/WalletContractV3R1.spec.js +44 -0
  79. package/dist/wallets/WalletContractV3R2.d.ts +57 -0
  80. package/dist/wallets/WalletContractV3R2.js +104 -0
  81. package/dist/wallets/WalletContractV3R2.spec.d.ts +8 -0
  82. package/dist/wallets/WalletContractV3R2.spec.js +44 -0
  83. package/dist/wallets/WalletContractV3Types.d.ts +12 -0
  84. package/dist/wallets/WalletContractV3Types.js +2 -0
  85. package/dist/wallets/WalletContractV4.d.ts +65 -0
  86. package/dist/wallets/WalletContractV4.js +105 -0
  87. package/dist/wallets/WalletContractV4.spec.d.ts +8 -0
  88. package/dist/wallets/WalletContractV4.spec.js +48 -0
  89. package/dist/wallets/WalletContractV5Beta.d.ts +3 -0
  90. package/dist/wallets/WalletContractV5Beta.js +19 -0
  91. package/dist/wallets/WalletContractV5R1.d.ts +3 -0
  92. package/dist/wallets/WalletContractV5R1.js +19 -0
  93. package/dist/wallets/signing/createWalletTransfer.d.ts +48 -0
  94. package/dist/wallets/signing/createWalletTransfer.js +190 -0
  95. package/dist/wallets/signing/singer.d.ts +9 -0
  96. package/dist/wallets/signing/singer.js +21 -0
  97. package/dist/wallets/v5beta/WalletContractV5Beta.d.ts +130 -0
  98. package/dist/wallets/v5beta/WalletContractV5Beta.js +211 -0
  99. package/dist/wallets/v5beta/WalletContractV5Beta.spec.d.ts +8 -0
  100. package/dist/wallets/v5beta/WalletContractV5Beta.spec.js +298 -0
  101. package/dist/wallets/v5beta/WalletV5BetaActions.d.ts +6 -0
  102. package/dist/wallets/v5beta/WalletV5BetaActions.js +92 -0
  103. package/dist/wallets/v5beta/WalletV5BetaActions.spec.d.ts +1 -0
  104. package/dist/wallets/v5beta/WalletV5BetaActions.spec.js +166 -0
  105. package/dist/wallets/v5beta/WalletV5BetaWalletId.d.ts +13 -0
  106. package/dist/wallets/v5beta/WalletV5BetaWalletId.js +31 -0
  107. package/dist/wallets/v5beta/WalletV5BetaWalletId.spec.d.ts +1 -0
  108. package/dist/wallets/v5beta/WalletV5BetaWalletId.spec.js +68 -0
  109. package/dist/wallets/v5beta/WalletV5OutActions.d.ts +17 -0
  110. package/dist/wallets/v5beta/WalletV5OutActions.js +11 -0
  111. package/dist/wallets/v5r1/WalletContractV5R1.d.ts +125 -0
  112. package/dist/wallets/v5r1/WalletContractV5R1.js +207 -0
  113. package/dist/wallets/v5r1/WalletContractV5R1.spec.d.ts +8 -0
  114. package/dist/wallets/v5r1/WalletContractV5R1.spec.js +321 -0
  115. package/dist/wallets/v5r1/WalletV5R1Actions.d.ts +12 -0
  116. package/dist/wallets/v5r1/WalletV5R1Actions.js +128 -0
  117. package/dist/wallets/v5r1/WalletV5R1Actions.spec.d.ts +1 -0
  118. package/dist/wallets/v5r1/WalletV5R1Actions.spec.js +262 -0
  119. package/dist/wallets/v5r1/WalletV5R1WalletId.d.ts +47 -0
  120. package/dist/wallets/v5r1/WalletV5R1WalletId.js +69 -0
  121. package/dist/wallets/v5r1/WalletV5R1WalletId.spec.d.ts +1 -0
  122. package/dist/wallets/v5r1/WalletV5R1WalletId.spec.js +72 -0
  123. package/package.json +5 -2
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Whales Corp.
4
+ * All Rights Reserved.
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE file in the root directory of this source tree.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.JettonMaster = void 0;
11
+ const core_1 = require("@ton/core");
12
+ class JettonMaster {
13
+ static create(address) {
14
+ return new JettonMaster(address);
15
+ }
16
+ constructor(address) {
17
+ this.address = address;
18
+ }
19
+ async getWalletAddress(provider, owner) {
20
+ let res = await provider.get('get_wallet_address', [{ type: 'slice', cell: (0, core_1.beginCell)().storeAddress(owner).endCell() }]);
21
+ return res.stack.readAddress();
22
+ }
23
+ async getJettonData(provider) {
24
+ let res = await provider.get('get_jetton_data', []);
25
+ let totalSupply = res.stack.readBigNumber();
26
+ let mintable = res.stack.readBoolean();
27
+ let adminAddress = res.stack.readAddress();
28
+ let content = res.stack.readCell();
29
+ let walletCode = res.stack.readCell();
30
+ return {
31
+ totalSupply,
32
+ mintable,
33
+ adminAddress,
34
+ content,
35
+ walletCode
36
+ };
37
+ }
38
+ }
39
+ exports.JettonMaster = JettonMaster;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Copyright (c) Whales Corp.
3
+ * All Rights Reserved.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ export {};
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Whales Corp.
4
+ * All Rights Reserved.
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE file in the root directory of this source tree.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const core_1 = require("@ton/core");
11
+ const createTestClient_1 = require("../utils/createTestClient");
12
+ const JettonMaster_1 = require("./JettonMaster");
13
+ const JettonWallet_1 = require("./JettonWallet");
14
+ describe('JettonMaster', () => {
15
+ it('should resolve jetton wallet address', async () => {
16
+ let client = (0, createTestClient_1.createTestClient)('mainnet');
17
+ let master = client.open(JettonMaster_1.JettonMaster.create(core_1.Address.parse('EQDQoc5M3Bh8eWFephi9bClhevelbZZvWhkqdo80XuY_0qXv')));
18
+ let walletAddress = await master.getWalletAddress(core_1.Address.parse('EQCo6VT63H1vKJTiUo6W4M8RrTURCyk5MdbosuL5auEqpz-C'));
19
+ let jettonData = await master.getJettonData();
20
+ expect(walletAddress.equals(core_1.Address.parse('EQDslTlGmbLTFi0j4MPT7UVggWR7XRDI2bW6vmNG6Tc_FBDE'))).toBe(true);
21
+ expect(jettonData.mintable).toBe(true);
22
+ expect(jettonData.adminAddress.equals(core_1.Address.parse('EQCppzUtmGSMg3FIRlFLzhToqbaC0xjmjzOn0o7H4M8Aua1t'))).toBe(true);
23
+ let wallet = client.open(JettonWallet_1.JettonWallet.create(walletAddress));
24
+ let balance = await wallet.getBalance();
25
+ expect(balance).toBe(0n);
26
+ });
27
+ });
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Copyright (c) Whales Corp.
3
+ * All Rights Reserved.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import { Address, Contract, ContractProvider } from "@ton/core";
9
+ export declare class JettonWallet implements Contract {
10
+ static create(address: Address): JettonWallet;
11
+ readonly address: Address;
12
+ private constructor();
13
+ getBalance(provider: ContractProvider): Promise<bigint>;
14
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright (c) Whales Corp.
4
+ * All Rights Reserved.
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE file in the root directory of this source tree.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.JettonWallet = void 0;
11
+ class JettonWallet {
12
+ static create(address) {
13
+ return new JettonWallet(address);
14
+ }
15
+ constructor(address) {
16
+ this.address = address;
17
+ }
18
+ async getBalance(provider) {
19
+ let state = await provider.getState();
20
+ if (state.state.type !== 'active') {
21
+ return 0n;
22
+ }
23
+ let res = await provider.get('get_wallet_data', []);
24
+ return res.stack.readBigNumber();
25
+ }
26
+ }
27
+ exports.JettonWallet = JettonWallet;
@@ -0,0 +1,17 @@
1
+ /// <reference types="node" />
2
+ import { Cell } from '@ton/core';
3
+ import { MultisigWallet } from './MultisigWallet';
4
+ export declare class MultisigOrder {
5
+ readonly payload: Cell;
6
+ signatures: {
7
+ [key: number]: Buffer;
8
+ };
9
+ private constructor();
10
+ static fromCell(cell: Cell): MultisigOrder;
11
+ static fromPayload(payload: Cell): MultisigOrder;
12
+ addSignature(ownerId: number, signature: Buffer, multisig: MultisigWallet): void;
13
+ sign(ownerId: number, secretKey: Buffer): Buffer;
14
+ unionSignatures(other: MultisigOrder): void;
15
+ clearSignatures(): void;
16
+ toCell(ownerId: number): Cell;
17
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ /* Made by @Gusarich and @Miandic */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.MultisigOrder = void 0;
5
+ const crypto_1 = require("@ton/crypto");
6
+ const core_1 = require("@ton/core");
7
+ class MultisigOrder {
8
+ constructor(payload) {
9
+ this.signatures = {};
10
+ this.payload = payload;
11
+ }
12
+ static fromCell(cell) {
13
+ let s = cell.beginParse();
14
+ let signatures = s.loadMaybeRef()?.beginParse();
15
+ const messagesCell = s.asCell();
16
+ let order = new MultisigOrder(messagesCell);
17
+ if (signatures) {
18
+ while (signatures.remainingBits > 0) {
19
+ const signature = signatures.loadBuffer(64);
20
+ const ownerId = signatures.loadUint(8);
21
+ order.signatures[ownerId] = signature;
22
+ if (signatures.remainingRefs > 0) {
23
+ signatures = signatures.loadRef().asSlice();
24
+ }
25
+ else {
26
+ signatures.skip(1);
27
+ }
28
+ }
29
+ signatures.endParse();
30
+ }
31
+ return order;
32
+ }
33
+ static fromPayload(payload) {
34
+ return new MultisigOrder(payload);
35
+ }
36
+ addSignature(ownerId, signature, multisig) {
37
+ const signingHash = this.payload.hash();
38
+ if (!(0, crypto_1.signVerify)(signingHash, signature, multisig.owners.get(ownerId).slice(0, -1))) {
39
+ throw Error('invalid signature');
40
+ }
41
+ this.signatures[ownerId] = signature;
42
+ }
43
+ sign(ownerId, secretKey) {
44
+ const signingHash = this.payload.hash();
45
+ this.signatures[ownerId] = (0, crypto_1.sign)(signingHash, secretKey);
46
+ return signingHash;
47
+ }
48
+ unionSignatures(other) {
49
+ this.signatures = Object.assign({}, this.signatures, other.signatures);
50
+ }
51
+ clearSignatures() {
52
+ this.signatures = {};
53
+ }
54
+ toCell(ownerId) {
55
+ let b = (0, core_1.beginCell)().storeBit(0);
56
+ for (const ownerId in this.signatures) {
57
+ const signature = this.signatures[ownerId];
58
+ b = (0, core_1.beginCell)()
59
+ .storeBit(1)
60
+ .storeRef((0, core_1.beginCell)()
61
+ .storeBuffer(signature)
62
+ .storeUint(parseInt(ownerId), 8)
63
+ .storeBuilder(b)
64
+ .endCell());
65
+ }
66
+ return (0, core_1.beginCell)()
67
+ .storeUint(ownerId, 8)
68
+ .storeBuilder(b)
69
+ .storeBuilder(this.payload.asBuilder())
70
+ .endCell();
71
+ }
72
+ }
73
+ exports.MultisigOrder = MultisigOrder;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ /* Made by @Gusarich and @Miandic */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const core_1 = require("@ton/core");
5
+ const crypto_1 = require("@ton/crypto");
6
+ const emulator_1 = require("@ton/emulator");
7
+ const MultisigOrderBuilder_1 = require("./MultisigOrderBuilder");
8
+ const MultisigWallet_1 = require("./MultisigWallet");
9
+ const MultisigOrder_1 = require("./MultisigOrder");
10
+ function createInternalMessage(bounce, dest, value, body, mode = 3) {
11
+ return {
12
+ info: {
13
+ bounce,
14
+ bounced: false,
15
+ createdAt: 0,
16
+ createdLt: 0n,
17
+ dest,
18
+ forwardFee: 0n,
19
+ ihrDisabled: true,
20
+ ihrFee: 0n,
21
+ type: 'internal',
22
+ value: {
23
+ coins: value,
24
+ },
25
+ },
26
+ body,
27
+ };
28
+ }
29
+ describe('MultisigOrder', () => {
30
+ var publicKeys;
31
+ var secretKeys;
32
+ beforeAll(async () => {
33
+ publicKeys = [];
34
+ secretKeys = [];
35
+ for (let i = 0; i < 10; i += 1) {
36
+ let kp = (0, crypto_1.keyPairFromSeed)(await (0, crypto_1.getSecureRandomBytes)(32));
37
+ publicKeys.push(kp.publicKey);
38
+ secretKeys.push(kp.secretKey);
39
+ }
40
+ });
41
+ it('should add messages', () => {
42
+ let order = new MultisigOrderBuilder_1.MultisigOrderBuilder(123);
43
+ order.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 1000000000n, core_1.Cell.EMPTY), 3);
44
+ order.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address2'), 0n, (0, core_1.beginCell)().storeUint(3, 123).endCell()), 3);
45
+ order.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 2000000000n, core_1.Cell.EMPTY), 3);
46
+ expect(order.messages.endCell().refs.length).toEqual(3);
47
+ });
48
+ it('should add signatures', () => {
49
+ let orderBuilder = new MultisigOrderBuilder_1.MultisigOrderBuilder(123);
50
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 1000000000n, core_1.Cell.EMPTY), 3);
51
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address2'), 0n, (0, core_1.beginCell)().storeUint(3, 123).endCell()), 3);
52
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 2000000000n, core_1.Cell.EMPTY), 3);
53
+ let order = orderBuilder.build();
54
+ order.sign(0, secretKeys[0]);
55
+ order.sign(1, secretKeys[1]);
56
+ order.sign(2, secretKeys[2]);
57
+ expect(Object.keys(order.signatures)).toHaveLength(3);
58
+ });
59
+ it('should union signatures', () => {
60
+ let order1Builder = new MultisigOrderBuilder_1.MultisigOrderBuilder(123);
61
+ order1Builder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 1000000000n, core_1.Cell.EMPTY), 3);
62
+ order1Builder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address2'), 0n, (0, core_1.beginCell)().storeUint(3, 123).endCell()), 3);
63
+ order1Builder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 2000000000n, core_1.Cell.EMPTY), 3);
64
+ let order1 = order1Builder.build();
65
+ order1.sign(0, secretKeys[0]);
66
+ order1.sign(1, secretKeys[1]);
67
+ order1.sign(2, secretKeys[2]);
68
+ let order2Builder = new MultisigOrderBuilder_1.MultisigOrderBuilder(123);
69
+ order2Builder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 1000000000n, core_1.Cell.EMPTY), 3);
70
+ order2Builder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address2'), 0n, (0, core_1.beginCell)().storeUint(3, 123).endCell()), 3);
71
+ order2Builder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 2000000000n, core_1.Cell.EMPTY), 3);
72
+ let order2 = order2Builder.build();
73
+ order2.sign(3, secretKeys[3]);
74
+ order2.sign(2, secretKeys[2]);
75
+ order2.sign(5, secretKeys[5]);
76
+ order1.unionSignatures(order2);
77
+ expect(Object.keys(order1.signatures)).toHaveLength(5);
78
+ });
79
+ it('should clear signatures', () => {
80
+ let orderBuilder = new MultisigOrderBuilder_1.MultisigOrderBuilder(123);
81
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 1000000000n, core_1.Cell.EMPTY), 3);
82
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address2'), 0n, (0, core_1.beginCell)().storeUint(3, 123).endCell()), 3);
83
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 2000000000n, core_1.Cell.EMPTY), 3);
84
+ let order = orderBuilder.build();
85
+ order.sign(0, secretKeys[0]);
86
+ order.sign(1, secretKeys[1]);
87
+ order.sign(2, secretKeys[2]);
88
+ order.clearSignatures();
89
+ expect(order.signatures).toBeNull;
90
+ });
91
+ it('should clear messages', () => {
92
+ let orderBuilder = new MultisigOrderBuilder_1.MultisigOrderBuilder(123);
93
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 1000000000n, core_1.Cell.EMPTY), 3);
94
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address2'), 0n, (0, core_1.beginCell)().storeUint(3, 123).endCell()), 3);
95
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 2000000000n, core_1.Cell.EMPTY), 3);
96
+ orderBuilder.clearMessages();
97
+ expect(orderBuilder.messages).toEqual((0, core_1.beginCell)());
98
+ });
99
+ it('should add signatures without secret key', () => {
100
+ let orderBuilder = new MultisigOrderBuilder_1.MultisigOrderBuilder(123);
101
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 1000000000n, core_1.Cell.EMPTY), 3);
102
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address2'), 0n, (0, core_1.beginCell)().storeUint(3, 123).endCell()), 3);
103
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 2000000000n, core_1.Cell.EMPTY), 3);
104
+ let order = orderBuilder.build();
105
+ order.sign(0, secretKeys[0]);
106
+ order.addSignature(1, (0, crypto_1.sign)(order.payload.hash(), secretKeys[1]), new MultisigWallet_1.MultisigWallet(publicKeys, 0, 123, 2));
107
+ expect(Object.keys(order.signatures)).toHaveLength(2);
108
+ });
109
+ it('should throw on more than 4 messages', () => {
110
+ let orderBuilder = new MultisigOrderBuilder_1.MultisigOrderBuilder(123);
111
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 1000000000n, core_1.Cell.EMPTY), 3);
112
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address2'), 0n, (0, core_1.beginCell)().storeUint(3, 123).endCell()), 3);
113
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 2000000000n, core_1.Cell.EMPTY), 3);
114
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 2000000000n, core_1.Cell.EMPTY), 3);
115
+ expect(() => orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 2000000000n, core_1.Cell.EMPTY), 3)).toThrow();
116
+ });
117
+ it('should throw on invalid signature', () => {
118
+ let orderBuilder = new MultisigOrderBuilder_1.MultisigOrderBuilder(123);
119
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 1000000000n, core_1.Cell.EMPTY), 3);
120
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address2'), 0n, (0, core_1.beginCell)().storeUint(3, 123).endCell()), 3);
121
+ orderBuilder.addMessage(createInternalMessage(true, (0, emulator_1.testAddress)('address1'), 2000000000n, core_1.Cell.EMPTY), 3);
122
+ let order = orderBuilder.build();
123
+ order.sign(0, secretKeys[0]);
124
+ expect(() => order.addSignature(1, Buffer.alloc(64), new MultisigWallet_1.MultisigWallet(publicKeys, 0, 123, 2))).toThrow();
125
+ });
126
+ it('should export to cell', () => { });
127
+ it('should load from cell', () => {
128
+ const order1Cell = core_1.Cell.fromBoc(Buffer.from('B5EE9C7241010201004700011B0000000031FD2F910000000001C0010068620014811EF5893924A58891883AA5563EE83305B47E62061D349E4BDECD66D2F2B1A02FAF08000000000000000000000000000021E26136', 'hex'))[0];
129
+ const order2Cell = core_1.Cell.fromBoc(Buffer.from('B5EE9C7241010301008C00021B8000000031FD2F910000000001C001020083E67410438C1007888D2CD45436502FBA877BECE26E7F384709B29B4A607181B8473CC4D45B44F7C47590740936231AE001727CCCA955DCDF959955D3889F4E0F00400068620014811EF5893924A58891883AA5563EE83305B47E62061D349E4BDECD66D2F2B1A02FAF080000000000000000000000000000621311E8', 'hex'))[0];
130
+ const order3Cell = core_1.Cell.fromBoc(Buffer.from('B5EE9C724101040100D100021B8000000031FD2F910000000001C0010201836100CBF8BBD98C5FE999FB232678DF1CC06A3522DB55736B3FF846C65AD1619694B8BDEF50B8DCF390AD54A4076B7444600FE54CC2EBFA68ED07F3063437DF0501C0030068620014811EF5893924A58891883AA5563EE83305B47E62061D349E4BDECD66D2F2B1A02FAF0800000000000000000000000000000083E67410438C1007888D2CD45436502FBA877BECE26E7F384709B29B4A607181B8473CC4D45B44F7C47590740936231AE001727CCCA955DCDF959955D3889F4E0F0040A434CD60', 'hex'))[0];
131
+ const order1 = MultisigOrder_1.MultisigOrder.fromCell(order1Cell);
132
+ const order2 = MultisigOrder_1.MultisigOrder.fromCell(order2Cell);
133
+ const order3 = MultisigOrder_1.MultisigOrder.fromCell(order3Cell);
134
+ expect(order1.payload.refs).toHaveLength(1);
135
+ expect(Object.keys(order1.signatures)).toHaveLength(0);
136
+ expect(Object.keys(order2.signatures)).toHaveLength(1);
137
+ expect(Object.keys(order3.signatures)).toHaveLength(2);
138
+ });
139
+ });
@@ -0,0 +1,13 @@
1
+ import { Builder, MessageRelaxed } from '@ton/core';
2
+ import { MultisigOrder } from './MultisigOrder';
3
+ export declare class MultisigOrderBuilder {
4
+ messages: Builder;
5
+ queryId: bigint;
6
+ private walletId;
7
+ private queryOffset;
8
+ constructor(walletId: number, offset?: number);
9
+ addMessage(message: MessageRelaxed, mode: number): void;
10
+ clearMessages(): void;
11
+ build(): MultisigOrder;
12
+ private updateQueryId;
13
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ /* Made by @Gusarich and @Miandic */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.MultisigOrderBuilder = void 0;
5
+ const core_1 = require("@ton/core");
6
+ const MultisigOrder_1 = require("./MultisigOrder");
7
+ class MultisigOrderBuilder {
8
+ constructor(walletId, offset) {
9
+ this.messages = (0, core_1.beginCell)();
10
+ this.queryId = 0n;
11
+ this.walletId = walletId;
12
+ this.queryOffset = offset || 7200;
13
+ }
14
+ addMessage(message, mode) {
15
+ if (this.messages.refs >= 4) {
16
+ throw Error('only 4 refs are allowed');
17
+ }
18
+ this.updateQueryId();
19
+ this.messages.storeUint(mode, 8);
20
+ this.messages.storeRef((0, core_1.beginCell)().store((0, core_1.storeMessageRelaxed)(message)).endCell());
21
+ }
22
+ clearMessages() {
23
+ this.messages = (0, core_1.beginCell)();
24
+ }
25
+ build() {
26
+ return MultisigOrder_1.MultisigOrder.fromPayload((0, core_1.beginCell)()
27
+ .storeUint(this.walletId, 32)
28
+ .storeUint(this.queryId, 64)
29
+ .storeBuilder(this.messages)
30
+ .endCell());
31
+ }
32
+ updateQueryId() {
33
+ const time = BigInt(Math.floor(Date.now() / 1000 + this.queryOffset));
34
+ this.queryId = time << 32n;
35
+ }
36
+ }
37
+ exports.MultisigOrderBuilder = MultisigOrderBuilder;
@@ -0,0 +1,27 @@
1
+ /// <reference types="node" />
2
+ import { TonClient } from '../index';
3
+ import { Address, ContractProvider, Dictionary, Sender, StateInit } from '@ton/core';
4
+ import { MultisigOrder } from './MultisigOrder';
5
+ export declare class MultisigWallet {
6
+ owners: Dictionary<number, Buffer>;
7
+ workchain: number;
8
+ walletId: number;
9
+ k: number;
10
+ address: Address;
11
+ provider: ContractProvider | null;
12
+ init: StateInit;
13
+ constructor(publicKeys: Buffer[], workchain: number, walletId: number, k: number, opts?: {
14
+ address?: Address;
15
+ provider?: ContractProvider;
16
+ client?: TonClient;
17
+ });
18
+ static fromAddress(address: Address, opts: {
19
+ provider?: ContractProvider;
20
+ client?: TonClient;
21
+ }): Promise<MultisigWallet>;
22
+ deployExternal(provider?: ContractProvider): Promise<void>;
23
+ deployInternal(sender: Sender, value?: bigint): Promise<void>;
24
+ sendOrder(order: MultisigOrder, secretKey: Buffer, provider?: ContractProvider): Promise<void>;
25
+ sendOrderWithoutSecretKey(order: MultisigOrder, signature: Buffer, ownerId: number, provider?: ContractProvider): Promise<void>;
26
+ getOwnerIdByPubkey(publicKey: Buffer): number;
27
+ }
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /* Made by @Gusarich and @Miandic */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.MultisigWallet = void 0;
5
+ const crypto_1 = require("@ton/crypto");
6
+ const core_1 = require("@ton/core");
7
+ const MULTISIG_CODE = core_1.Cell.fromBase64('te6ccgECKwEABBgAART/APSkE/S88sgLAQIBIAIDAgFIBAUE2vIgxwCOgzDbPOCDCNcYIPkBAdMH2zwiwAAToVNxePQOb6Hyn9s8VBq6+RDyoAb0BCD5AQHTH1EYuvKq0z9wUwHwCgHCCAGDCryx8mhTFYBA9A5voSCYDqQgwgryZw7f+COqH1NAufJhVCOjU04gIyEiAgLMBgcCASAMDQIBIAgJAgFmCgsAA9GEAiPymAvHoHN9CYbZ5S7Z4BPHohwhJQAtAKkItdJEqCTItdKlwLUAdAT8ArobBKAATwhbpEx4CBukTDgAdAg10rDAJrUAvALyFjPFszJ4HHXI8gBzxb0AMmACASAODwIBIBQVARW77ZbVA0cFUg2zyCoCAUgQEQIBIBITAXOxHXQgwjXGCD5AQHTB4IB1MTtQ9hTIHj0Dm+h8p/XC/9eMfkQ8qCuAfQEIW6TW3Ey4PkBWNs8AaQBgJwA9rtqA6ADoAPoCAXoCEfyAgPyA3XlP+AXkegAA54tkwAAXrhlXP8EA1WZ2oexAAgEgFhcCASAYGQFRtyVbZ4YmRmpGEAgegc30McJNhFpAADMaYeYuAFrgJhwLb+4cC3d0bhAjAYm1WZtnhqvgb+2xxsoicAgej430pBHEoFpAADHDhBACGuQkuuBk9kUWE5kAOeLKhACQCB6IYFImHFImHFImXEA2YlzNijAjAgEgGhsAF7UGtc4QQDVZnah7EAIBIBwdAgOZOB4fARGsGm2eL4G2CUAjABWt+UEAzJV2oewYQAENqTbPBVfBYCMAFa3f3CCAarM7UPYgAiDbPALyZfgAUENxQxPbPO1UIyoACtP/0wcwBKDbPC+uUyCw8mISsQKkJbNTHLmwJYEA4aojoCi8sPJpggGGoPgBBZcCERACPj4wjo0REB/bPEDXePRDEL0F4lQWW1Rz51YQU9zbPFRxClR6vCQlKCYAIO1E0NMf0wfTB9M/9AT0BNEAXgGOGjDSAAHyo9MH0wdQA9cBIPkBBfkBFbrypFAD4GwhIddKqgIi10m68qtwVCATAAwByMv/ywcE1ts87VT4D3AlblOJvrGYEG4QLVDHXwePGzBUJANQTds8UFWgRlAQSRA6SwlTuds8UFQWf+L4AAeDJaGOLCaAQPSWb6UglDBTA7neII4WODk5CNIAAZfTBzAW8AcFkTDifwgHBZJsMeKz5jAGKicoKQBgcI4pA9CDCNcY0wf0BDBTFnj0Dm+h8qXXC/9URUT5EPKmrlIgsVIDvRShI27mbCIyAH5SML6OIF8D+ACTItdKmALTB9QC+wAC6DJwyMoAQBSAQPRDAvAHjhdxyMsAFMsHEssHWM8BWM8WQBOAQPRDAeIBII6KEEUQNEMA2zztVJJfBuIqABzIyx/LB8sHyz/0APQAyQ==');
8
+ class MultisigWallet {
9
+ constructor(publicKeys, workchain, walletId, k, opts) {
10
+ this.provider = null;
11
+ this.owners = core_1.Dictionary.empty();
12
+ this.workchain = workchain;
13
+ this.walletId = walletId;
14
+ this.k = k;
15
+ for (let i = 0; i < publicKeys.length; i += 1) {
16
+ this.owners.set(i, Buffer.concat([publicKeys[i], Buffer.alloc(1)]));
17
+ }
18
+ this.init = {
19
+ code: MULTISIG_CODE,
20
+ data: (0, core_1.beginCell)()
21
+ .storeUint(this.walletId, 32)
22
+ .storeUint(this.owners.size, 8)
23
+ .storeUint(this.k, 8)
24
+ .storeUint(0, 64)
25
+ .storeDict(this.owners, core_1.Dictionary.Keys.Uint(8), core_1.Dictionary.Values.Buffer(33))
26
+ .storeBit(0)
27
+ .endCell(),
28
+ };
29
+ this.address = opts?.address || (0, core_1.contractAddress)(workchain, this.init);
30
+ if (opts?.provider) {
31
+ this.provider = opts.provider;
32
+ }
33
+ else if (opts?.client) {
34
+ this.provider = opts.client.provider(this.address, {
35
+ code: this.init.code,
36
+ data: this.init.data,
37
+ });
38
+ }
39
+ }
40
+ static async fromAddress(address, opts) {
41
+ let provider;
42
+ if (opts.provider) {
43
+ provider = opts.provider;
44
+ }
45
+ else {
46
+ if (!opts.client) {
47
+ throw Error('Either provider or client must be specified');
48
+ }
49
+ provider = opts.client.provider(address, {
50
+ code: null,
51
+ data: null,
52
+ });
53
+ }
54
+ const contractState = (await provider.getState()).state;
55
+ if (contractState.type !== 'active') {
56
+ throw Error('Contract must be active');
57
+ }
58
+ const data = core_1.Cell.fromBoc(contractState.data)[0].beginParse();
59
+ const walletId = data.loadUint(32);
60
+ data.skip(8);
61
+ const k = data.loadUint(8);
62
+ data.skip(64);
63
+ const owners = data.loadDict(core_1.Dictionary.Keys.Uint(8), core_1.Dictionary.Values.Buffer(33));
64
+ let publicKeys = [];
65
+ for (const [key, value] of owners) {
66
+ const publicKey = value.subarray(0, 32);
67
+ publicKeys.push(publicKey);
68
+ }
69
+ return new MultisigWallet(publicKeys, address.workChain, walletId, k, {
70
+ address,
71
+ provider,
72
+ client: opts.client,
73
+ });
74
+ }
75
+ async deployExternal(provider) {
76
+ if (!provider && !this.provider) {
77
+ throw Error('you must specify provider if there is no such property in MultisigWallet instance');
78
+ }
79
+ if (!provider) {
80
+ provider = this.provider;
81
+ }
82
+ await provider.external(core_1.Cell.EMPTY);
83
+ }
84
+ async deployInternal(sender, value = 1000000000n) {
85
+ await sender.send({
86
+ sendMode: core_1.SendMode.PAY_GAS_SEPARATELY + core_1.SendMode.IGNORE_ERRORS,
87
+ to: this.address,
88
+ value: value,
89
+ init: this.init,
90
+ body: core_1.Cell.EMPTY,
91
+ bounce: true,
92
+ });
93
+ }
94
+ async sendOrder(order, secretKey, provider) {
95
+ if (!provider && !this.provider) {
96
+ throw Error('you must specify provider if there is no such property in MultisigWallet instance');
97
+ }
98
+ if (!provider) {
99
+ provider = this.provider;
100
+ }
101
+ let publicKey = (0, crypto_1.keyPairFromSecretKey)(secretKey).publicKey;
102
+ let ownerId = this.getOwnerIdByPubkey(publicKey);
103
+ let cell = order.toCell(ownerId);
104
+ let signature = (0, crypto_1.sign)(cell.hash(), secretKey);
105
+ cell = (0, core_1.beginCell)()
106
+ .storeBuffer(signature)
107
+ .storeSlice(cell.asSlice())
108
+ .endCell();
109
+ await provider.external(cell);
110
+ }
111
+ async sendOrderWithoutSecretKey(order, signature, ownerId, provider) {
112
+ if (!provider && !this.provider) {
113
+ throw Error('you must specify provider if there is no such property in MultisigWallet instance');
114
+ }
115
+ if (!provider) {
116
+ provider = this.provider;
117
+ }
118
+ let cell = order.toCell(ownerId);
119
+ cell = (0, core_1.beginCell)()
120
+ .storeBuffer(signature)
121
+ .storeSlice(cell.asSlice())
122
+ .endCell();
123
+ await provider.external(cell);
124
+ }
125
+ getOwnerIdByPubkey(publicKey) {
126
+ for (const [key, value] of this.owners) {
127
+ if (value.subarray(0, 32).equals(publicKey)) {
128
+ return key;
129
+ }
130
+ }
131
+ throw Error('public key is not an owner');
132
+ }
133
+ }
134
+ exports.MultisigWallet = MultisigWallet;
@@ -0,0 +1 @@
1
+ export {};