@getomnichain/omnichain 0.6.3 → 0.7.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.
Files changed (104) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/cjs/chain_ids.js +2 -2
  3. package/dist/cjs/chain_ids.js.map +1 -1
  4. package/dist/cjs/errors.js +6 -0
  5. package/dist/cjs/errors.js.map +1 -1
  6. package/dist/cjs/index.js +1 -1
  7. package/dist/cjs/index.js.map +1 -1
  8. package/dist/cjs/ton/index.js +12 -0
  9. package/dist/cjs/ton/index.js.map +1 -1
  10. package/dist/cjs/ton/ton_address.js +72 -14
  11. package/dist/cjs/ton/ton_address.js.map +1 -1
  12. package/dist/cjs/ton/ton_asset.js +21 -0
  13. package/dist/cjs/ton/ton_asset.js.map +1 -0
  14. package/dist/cjs/ton/ton_assets.js +10 -0
  15. package/dist/cjs/ton/ton_assets.js.map +1 -0
  16. package/dist/cjs/ton/ton_chain.js +483 -0
  17. package/dist/cjs/ton/ton_chain.js.map +1 -0
  18. package/dist/cjs/ton/ton_chains.js +21 -0
  19. package/dist/cjs/ton/ton_chains.js.map +1 -0
  20. package/dist/cjs/ton/ton_jetton_metadata.js +107 -0
  21. package/dist/cjs/ton/ton_jetton_metadata.js.map +1 -0
  22. package/dist/cjs/ton/ton_messages.js +174 -0
  23. package/dist/cjs/ton/ton_messages.js.map +1 -0
  24. package/dist/cjs/ton/ton_provider.js +456 -0
  25. package/dist/cjs/ton/ton_provider.js.map +1 -0
  26. package/dist/cjs/ton/ton_tonapi.js +243 -0
  27. package/dist/cjs/ton/ton_tonapi.js.map +1 -0
  28. package/dist/cjs/ton/ton_toncenter.js +252 -0
  29. package/dist/cjs/ton/ton_toncenter.js.map +1 -0
  30. package/dist/cjs/ton/ton_transaction_status.js +231 -0
  31. package/dist/cjs/ton/ton_transaction_status.js.map +1 -0
  32. package/dist/cjs/ton/ton_transactions.js +107 -0
  33. package/dist/cjs/ton/ton_transactions.js.map +1 -0
  34. package/dist/cjs/ton/ton_wallet.js +285 -0
  35. package/dist/cjs/ton/ton_wallet.js.map +1 -0
  36. package/dist/esm/chain_ids.js +2 -2
  37. package/dist/esm/chain_ids.js.map +1 -1
  38. package/dist/esm/errors.d.ts +3 -0
  39. package/dist/esm/errors.d.ts.map +1 -1
  40. package/dist/esm/errors.js +5 -0
  41. package/dist/esm/errors.js.map +1 -1
  42. package/dist/esm/index.d.ts +1 -1
  43. package/dist/esm/index.d.ts.map +1 -1
  44. package/dist/esm/index.js +1 -1
  45. package/dist/esm/index.js.map +1 -1
  46. package/dist/esm/ton/index.d.ts +12 -0
  47. package/dist/esm/ton/index.d.ts.map +1 -1
  48. package/dist/esm/ton/index.js +12 -0
  49. package/dist/esm/ton/index.js.map +1 -1
  50. package/dist/esm/ton/ton_address.d.ts +26 -2
  51. package/dist/esm/ton/ton_address.d.ts.map +1 -1
  52. package/dist/esm/ton/ton_address.js +70 -14
  53. package/dist/esm/ton/ton_address.js.map +1 -1
  54. package/dist/esm/ton/ton_asset.d.ts +12 -0
  55. package/dist/esm/ton/ton_asset.d.ts.map +1 -0
  56. package/dist/esm/ton/ton_asset.js +17 -0
  57. package/dist/esm/ton/ton_asset.js.map +1 -0
  58. package/dist/esm/ton/ton_assets.d.ts +6 -0
  59. package/dist/esm/ton/ton_assets.d.ts.map +1 -0
  60. package/dist/esm/ton/ton_assets.js +7 -0
  61. package/dist/esm/ton/ton_assets.js.map +1 -0
  62. package/dist/esm/ton/ton_chain.d.ts +205 -0
  63. package/dist/esm/ton/ton_chain.d.ts.map +1 -0
  64. package/dist/esm/ton/ton_chain.js +479 -0
  65. package/dist/esm/ton/ton_chain.js.map +1 -0
  66. package/dist/esm/ton/ton_chains.d.ts +11 -0
  67. package/dist/esm/ton/ton_chains.d.ts.map +1 -0
  68. package/dist/esm/ton/ton_chains.js +18 -0
  69. package/dist/esm/ton/ton_chains.js.map +1 -0
  70. package/dist/esm/ton/ton_jetton_metadata.d.ts +36 -0
  71. package/dist/esm/ton/ton_jetton_metadata.d.ts.map +1 -0
  72. package/dist/esm/ton/ton_jetton_metadata.js +103 -0
  73. package/dist/esm/ton/ton_jetton_metadata.js.map +1 -0
  74. package/dist/esm/ton/ton_messages.d.ts +133 -0
  75. package/dist/esm/ton/ton_messages.d.ts.map +1 -0
  76. package/dist/esm/ton/ton_messages.js +159 -0
  77. package/dist/esm/ton/ton_messages.js.map +1 -0
  78. package/dist/esm/ton/ton_provider.d.ts +261 -0
  79. package/dist/esm/ton/ton_provider.d.ts.map +1 -0
  80. package/dist/esm/ton/ton_provider.js +432 -0
  81. package/dist/esm/ton/ton_provider.js.map +1 -0
  82. package/dist/esm/ton/ton_tonapi.d.ts +39 -0
  83. package/dist/esm/ton/ton_tonapi.d.ts.map +1 -0
  84. package/dist/esm/ton/ton_tonapi.js +239 -0
  85. package/dist/esm/ton/ton_tonapi.js.map +1 -0
  86. package/dist/esm/ton/ton_toncenter.d.ts +25 -0
  87. package/dist/esm/ton/ton_toncenter.d.ts.map +1 -0
  88. package/dist/esm/ton/ton_toncenter.js +248 -0
  89. package/dist/esm/ton/ton_toncenter.js.map +1 -0
  90. package/dist/esm/ton/ton_transaction_status.d.ts +116 -0
  91. package/dist/esm/ton/ton_transaction_status.d.ts.map +1 -0
  92. package/dist/esm/ton/ton_transaction_status.js +226 -0
  93. package/dist/esm/ton/ton_transaction_status.js.map +1 -0
  94. package/dist/esm/ton/ton_transactions.d.ts +54 -0
  95. package/dist/esm/ton/ton_transactions.d.ts.map +1 -0
  96. package/dist/esm/ton/ton_transactions.js +100 -0
  97. package/dist/esm/ton/ton_transactions.js.map +1 -0
  98. package/dist/esm/ton/ton_wallet.d.ts +134 -0
  99. package/dist/esm/ton/ton_wallet.d.ts.map +1 -0
  100. package/dist/esm/ton/ton_wallet.js +278 -0
  101. package/dist/esm/ton/ton_wallet.js.map +1 -0
  102. package/docs/README.md +2 -1
  103. package/docs/ton.md +164 -0
  104. package/package.json +5 -1
@@ -0,0 +1,134 @@
1
+ import { type StateInit } from '@ton/core';
2
+ import { WalletContractV3R2, WalletContractV4, WalletContractV5R1 } from '@ton/ton';
3
+ import type { Chain } from '../chain.base.ts';
4
+ import { ChainType, WalletFamily } from '../chain_type.ts';
5
+ import { AbstractTransactionPrerequisite } from '../transaction_prerequisite.ts';
6
+ import { UnsignedTransaction } from '../unsigned_transaction.ts';
7
+ import { AbstractBip32StyleSingleAccountWallet, AbstractSignedMessage } from '../wallet.base.ts';
8
+ import { type TonUserFriendlyOptions } from './ton_address.ts';
9
+ import { type TonInternalRequest, type TonOutMessage, type TonWalletVersion, TonSignedMessage } from './ton_messages.ts';
10
+ import { TonSignedTransaction } from './ton_transactions.ts';
11
+ /** Seconds a request stays valid unless the caller says otherwise. */
12
+ export declare const TON_DEFAULT_REQUEST_TTL_SECONDS = 60;
13
+ /** SLIP-0010 ed25519 derivation along hardened `path` segments (e.g. `[44, 607, 0]`) from a BIP-39 seed. */
14
+ export declare function deriveSlip10Ed25519Seed(bip39Seed: Uint8Array, path: readonly number[]): Buffer;
15
+ /** The ed25519 seed of `m/44'/607'/{index}'`. */
16
+ export declare function deriveTonEd25519Seed(bip39Seed: Uint8Array, index: number): Buffer;
17
+ export declare const TON_WALLET_VERSIONS: readonly TonWalletVersion[];
18
+ /** The workchains a wallet can live on: the basechain (0) and the masterchain (-1). */
19
+ export type TonWorkchain = 0 | -1;
20
+ /** The v3r2 / v4r2 wallet id the Python SDK uses on both workchains. */
21
+ export declare const TON_LEGACY_DEFAULT_WALLET_ID = 698983191;
22
+ /** v3r2 / v4r2 send at most four messages per request. */
23
+ export declare const TON_LEGACY_MAX_MESSAGES = 4;
24
+ /** The path the Python SDK accepts as a marker for TON's own scheme; it derives nothing. */
25
+ export declare const TON_PYTHON_MARKER_PATH = "m/44'/607'/0'/0/0";
26
+ /**
27
+ * The ed25519 seed TON's own mnemonic scheme gives (what TON wallets,
28
+ * `@ton/crypto`'s `mnemonicToPrivateKey` and the Python SDK compute):
29
+ * HMAC-SHA512 of the words keyed by the phrase, then PBKDF2-SHA512 with
30
+ * "TON default seed", 100,000 rounds; the first 32 bytes. The words are
31
+ * trimmed and lowercased, as the Python SDK does; they are not validated.
32
+ */
33
+ export declare function deriveTonNativeSeed(mnemonicStr: string): Buffer;
34
+ export interface TonRequestArgs {
35
+ seqno: number;
36
+ messages: readonly TonOutMessage[];
37
+ /** Unix seconds; defaults to now + {@link TON_DEFAULT_REQUEST_TTL_SECONDS}. */
38
+ validUntil?: number;
39
+ }
40
+ export interface TonExternalRequest {
41
+ /** The external message, base64 BOC, ready to broadcast. */
42
+ boc: string;
43
+ /** Its normalized hash, lowercase hex — the transaction id. */
44
+ hash: string;
45
+ seqno: number;
46
+ validUntil: number;
47
+ }
48
+ /**
49
+ * A wallet v5r1 (W5) account, its key derived from a BIP-39 mnemonic with
50
+ * SLIP-0010 ed25519 at the hardened path `m/44'/607'/{index}'`, on workchain 0
51
+ * with the mainnet client wallet id.
52
+ *
53
+ * It signs two kinds of request: an external one it sends itself (paying its
54
+ * own fees), and an internal one a relayer delivers and pays for
55
+ * (`tonRelayMessage`).
56
+ */
57
+ export declare class TonWallet extends AbstractBip32StyleSingleAccountWallet {
58
+ #private;
59
+ readonly publicKey: Buffer;
60
+ /** The wallet contract: W5 (v5r1, the default), or v4r2 / v3r2 as the Python SDK builds them. */
61
+ readonly version: TonWalletVersion;
62
+ /** 0 (the basechain, the default) or -1 (the masterchain, where gas and storage cost far more). */
63
+ readonly workchain: TonWorkchain;
64
+ readonly contract: WalletContractV5R1 | WalletContractV4 | WalletContractV3R2;
65
+ private readonly _address;
66
+ constructor(ed25519Seed: Uint8Array, opts?: {
67
+ version?: TonWalletVersion;
68
+ workchain?: TonWorkchain;
69
+ });
70
+ static chainType(): ChainType;
71
+ static walletFamily(): WalletFamily;
72
+ chainType(): ChainType;
73
+ walletFamily(): WalletFamily;
74
+ /**
75
+ * - **No `derivationPath`** (or Python's marker `m/44'/607'/0'/0/0`): TON's
76
+ * own mnemonic scheme, as TON wallets and the Python SDK derive it — one
77
+ * key per mnemonic, so a wallet's own words give its W5 account. A
78
+ * passphrase is refused: Python ignores it, so honouring it would give a
79
+ * key Python does not.
80
+ * - **A `derivationPath`** (`derivationPath({ account })`): BIP-39 and
81
+ * SLIP-0010 at that path — many accounts from one mnemonic. Note that
82
+ * `m/44'/607'/0'` is account 0 of this scheme, not Python's key.
83
+ */
84
+ static fromMnemonic(mnemonicStr: string, opts?: {
85
+ derivationPath?: string;
86
+ passphrase?: string;
87
+ version?: TonWalletVersion;
88
+ workchain?: TonWorkchain;
89
+ }): TonWallet;
90
+ static derivationPath(args?: {
91
+ account?: number;
92
+ }): string;
93
+ /** Canonical raw address, `0:<hex>`. */
94
+ get address(): string;
95
+ addressUserFriendly(opts?: TonUserFriendlyOptions): string;
96
+ /** The code and data that deploy this wallet; attach while it is not deployed. */
97
+ get stateInit(): StateInit;
98
+ /**
99
+ * A request this wallet sends itself, as an external message. Pass `deploy`
100
+ * while the wallet is not deployed, so the message carries its StateInit.
101
+ *
102
+ * Every version sends external requests with "ignore errors" (+2) on every
103
+ * message (W5 forces it; v3r2 / v4r2 get it here), so a message that cannot
104
+ * be sent is skipped rather than failing the others — a v3r2 / v4r2
105
+ * request whose action phase failed would keep its seqno and could land
106
+ * again. v3r2 / v4r2 carry at most 4 messages.
107
+ */
108
+ createExternalRequest(args: TonRequestArgs & {
109
+ deploy?: boolean;
110
+ }): TonExternalRequest;
111
+ /**
112
+ * A signed internal request (op `0x73696e74`) for a relayer to deliver with
113
+ * `tonRelayMessage` — the gasless path, where another account pays. W5
114
+ * (v5r1) only: v3r2 / v4r2 wallets accept requests only as external
115
+ * messages they pay for themselves. Send modes are kept as given, so
116
+ * without "ignore errors" the request's messages leave all together or not
117
+ * at all.
118
+ */
119
+ createInternalRequest(args: TonRequestArgs): TonInternalRequest;
120
+ /**
121
+ * A v3r2 / v4r2 signed body: the signature, then wallet id, valid_until,
122
+ * seqno, (v4r2: op 0, "send messages"), and each message with its own send
123
+ * mode (+2) — what `@ton/ton`'s transfers build, with per-message modes.
124
+ */
125
+ private legacyExternalBody;
126
+ /** Signs `transaction` as an external request, reading the seqno and deployment from `chain`. */
127
+ signTransaction(transaction: UnsignedTransaction, chain: Chain): Promise<TonSignedTransaction>;
128
+ /** An ed25519 signature over {@link tonMessageHash}, hex; never over the message's bytes, which could pass for a request hash. */
129
+ signMessage(message: string): TonSignedMessage;
130
+ verifySignature(message: string, signedMessage: AbstractSignedMessage): boolean;
131
+ handleTransactionPrerequisite(prerequisite: AbstractTransactionPrerequisite): Promise<never>;
132
+ private static indexFromDerivationPath;
133
+ }
134
+ //# sourceMappingURL=ton_wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ton_wallet.d.ts","sourceRoot":"","sources":["../../../ton/ton_wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,278 @@
1
+ import { createHmac, pbkdf2Sync } from 'node:crypto';
2
+ import { SendMode, beginCell, external, storeMessage, storeMessageRelaxed } from '@ton/core';
3
+ import { keyPairFromSeed, sign } from '@ton/crypto';
4
+ import { WalletContractV3R2, WalletContractV4, WalletContractV5R1 } from '@ton/ton';
5
+ import { mnemonicToSeedBip39 } from "../bip39.js";
6
+ import { ChainType, WalletFamily } from "../chain_type.js";
7
+ import { ChainError, ChainErrorKinds } from "../errors.js";
8
+ import { AbstractBip32StyleSingleAccountWallet } from "../wallet.base.js";
9
+ import { TonAddress } from "./ton_address.js";
10
+ import { TonChain } from "./ton_chain.js";
11
+ import { TonSignedMessage, tonMessageHash, tonNormalizedExternalHash, tonOutActions, } from "./ton_messages.js";
12
+ import { TonSignedTransaction, TonUnsignedTransaction } from "./ton_transactions.js";
13
+ const TON_COIN_TYPE = 607;
14
+ const TON_DERIVATION_PATH_REGEX = /^m\/44'\/607'\/(\d+)'$/;
15
+ const SLIP10_ED25519_SEED_MODIFIER = 'ed25519 seed';
16
+ const FIRST_HARDENED_INDEX = 0x80000000;
17
+ /** Seconds a request stays valid unless the caller says otherwise. */
18
+ export const TON_DEFAULT_REQUEST_TTL_SECONDS = 60;
19
+ /** SLIP-0010 ed25519 derivation along hardened `path` segments (e.g. `[44, 607, 0]`) from a BIP-39 seed. */
20
+ export function deriveSlip10Ed25519Seed(bip39Seed, path) {
21
+ let digest = createHmac('sha512', SLIP10_ED25519_SEED_MODIFIER).update(bip39Seed).digest();
22
+ let il = digest.subarray(0, 32);
23
+ let ir = digest.subarray(32);
24
+ for (const segment of path) {
25
+ if (!Number.isInteger(segment) || segment < 0 || segment >= FIRST_HARDENED_INDEX) {
26
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Invalid SLIP-0010 path segment ${segment}`);
27
+ }
28
+ const indexBytes = Buffer.alloc(4);
29
+ indexBytes.writeUInt32BE(FIRST_HARDENED_INDEX + segment);
30
+ digest = createHmac('sha512', ir).update(Buffer.concat([Buffer.alloc(1), il, indexBytes])).digest();
31
+ il = digest.subarray(0, 32);
32
+ ir = digest.subarray(32);
33
+ }
34
+ return Buffer.from(il);
35
+ }
36
+ /** The ed25519 seed of `m/44'/607'/{index}'`. */
37
+ export function deriveTonEd25519Seed(bip39Seed, index) {
38
+ return deriveSlip10Ed25519Seed(bip39Seed, [44, TON_COIN_TYPE, index]);
39
+ }
40
+ export const TON_WALLET_VERSIONS = ['v3r2', 'v4r2', 'v5r1'];
41
+ /** The v3r2 / v4r2 wallet id the Python SDK uses on both workchains. */
42
+ export const TON_LEGACY_DEFAULT_WALLET_ID = 698983191;
43
+ /** v3r2 / v4r2 send at most four messages per request. */
44
+ export const TON_LEGACY_MAX_MESSAGES = 4;
45
+ /** The path the Python SDK accepts as a marker for TON's own scheme; it derives nothing. */
46
+ export const TON_PYTHON_MARKER_PATH = "m/44'/607'/0'/0/0";
47
+ const TON_NATIVE_SEED_SALT = 'TON default seed';
48
+ const TON_NATIVE_PBKDF2_ITERATIONS = 100_000;
49
+ /**
50
+ * The ed25519 seed TON's own mnemonic scheme gives (what TON wallets,
51
+ * `@ton/crypto`'s `mnemonicToPrivateKey` and the Python SDK compute):
52
+ * HMAC-SHA512 of the words keyed by the phrase, then PBKDF2-SHA512 with
53
+ * "TON default seed", 100,000 rounds; the first 32 bytes. The words are
54
+ * trimmed and lowercased, as the Python SDK does; they are not validated.
55
+ */
56
+ export function deriveTonNativeSeed(mnemonicStr) {
57
+ const words = mnemonicStr.trim().toLowerCase().split(/\s+/).filter((word) => word.length > 0);
58
+ if (words.length === 0)
59
+ throw new ChainError(ChainErrorKinds.InvalidArgument, 'The mnemonic is empty');
60
+ const entropy = createHmac('sha512', words.join(' ')).update('').digest();
61
+ return pbkdf2Sync(entropy, TON_NATIVE_SEED_SALT, TON_NATIVE_PBKDF2_ITERATIONS, 64, 'sha512').subarray(0, 32);
62
+ }
63
+ /**
64
+ * A wallet v5r1 (W5) account, its key derived from a BIP-39 mnemonic with
65
+ * SLIP-0010 ed25519 at the hardened path `m/44'/607'/{index}'`, on workchain 0
66
+ * with the mainnet client wallet id.
67
+ *
68
+ * It signs two kinds of request: an external one it sends itself (paying its
69
+ * own fees), and an internal one a relayer delivers and pays for
70
+ * (`tonRelayMessage`).
71
+ */
72
+ export class TonWallet extends AbstractBip32StyleSingleAccountWallet {
73
+ publicKey;
74
+ /** The wallet contract: W5 (v5r1, the default), or v4r2 / v3r2 as the Python SDK builds them. */
75
+ version;
76
+ /** 0 (the basechain, the default) or -1 (the masterchain, where gas and storage cost far more). */
77
+ workchain;
78
+ contract;
79
+ #secretKey;
80
+ _address;
81
+ constructor(ed25519Seed, opts = {}) {
82
+ super();
83
+ if (ed25519Seed.length !== 32) {
84
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `A TON ed25519 seed is 32 bytes, got ${ed25519Seed.length}`);
85
+ }
86
+ const version = opts.version ?? 'v5r1';
87
+ if (!TON_WALLET_VERSIONS.includes(version)) {
88
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `TON wallet version must be one of ${TON_WALLET_VERSIONS.join(', ')}, got ${String(version)}`);
89
+ }
90
+ const workchain = opts.workchain ?? 0;
91
+ if (workchain !== 0 && workchain !== -1) {
92
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `A TON wallet lives on workchain 0 or -1, got ${String(workchain)}`);
93
+ }
94
+ const keyPair = keyPairFromSeed(Buffer.from(ed25519Seed));
95
+ this.publicKey = keyPair.publicKey;
96
+ this.#secretKey = keyPair.secretKey;
97
+ this.version = version;
98
+ this.workchain = workchain;
99
+ // The wallet ids the Python SDK (ton_core) uses on either workchain: W5's
100
+ // context names workchain 0 (as @ton/ton's default does), and v3r2 /
101
+ // v4r2's is 698983191 whatever the wallet's workchain — where @ton/ton
102
+ // would add the workchain, giving another address on -1.
103
+ const publicKey = keyPair.publicKey;
104
+ this.contract =
105
+ version === 'v5r1'
106
+ ? WalletContractV5R1.create({ workchain, publicKey })
107
+ : version === 'v4r2'
108
+ ? WalletContractV4.create({ workchain, publicKey, walletId: TON_LEGACY_DEFAULT_WALLET_ID })
109
+ : WalletContractV3R2.create({ workchain, publicKey, walletId: TON_LEGACY_DEFAULT_WALLET_ID });
110
+ this._address = this.contract.address.toRawString();
111
+ }
112
+ [Symbol.for('nodejs.util.inspect.custom')]() {
113
+ return `TonWallet { address: '${this._address}' }`;
114
+ }
115
+ static chainType() {
116
+ return ChainType.TON;
117
+ }
118
+ static walletFamily() {
119
+ return WalletFamily.TON;
120
+ }
121
+ chainType() {
122
+ return TonWallet.chainType();
123
+ }
124
+ walletFamily() {
125
+ return TonWallet.walletFamily();
126
+ }
127
+ /**
128
+ * - **No `derivationPath`** (or Python's marker `m/44'/607'/0'/0/0`): TON's
129
+ * own mnemonic scheme, as TON wallets and the Python SDK derive it — one
130
+ * key per mnemonic, so a wallet's own words give its W5 account. A
131
+ * passphrase is refused: Python ignores it, so honouring it would give a
132
+ * key Python does not.
133
+ * - **A `derivationPath`** (`derivationPath({ account })`): BIP-39 and
134
+ * SLIP-0010 at that path — many accounts from one mnemonic. Note that
135
+ * `m/44'/607'/0'` is account 0 of this scheme, not Python's key.
136
+ */
137
+ static fromMnemonic(mnemonicStr, opts = {}) {
138
+ if (opts.derivationPath === undefined || opts.derivationPath === TON_PYTHON_MARKER_PATH) {
139
+ if (opts.passphrase !== undefined && opts.passphrase !== '') {
140
+ throw new ChainError(ChainErrorKinds.InvalidArgument, "TON's own mnemonic scheme takes no passphrase here (the Python SDK ignores it); pass a derivationPath to use one");
141
+ }
142
+ return new TonWallet(deriveTonNativeSeed(mnemonicStr), { version: opts.version, workchain: opts.workchain });
143
+ }
144
+ const index = TonWallet.indexFromDerivationPath(opts.derivationPath);
145
+ return new TonWallet(deriveTonEd25519Seed(mnemonicToSeedBip39(mnemonicStr, opts.passphrase ?? ''), index), { version: opts.version, workchain: opts.workchain });
146
+ }
147
+ static derivationPath(args = {}) {
148
+ return `m/44'/${TON_COIN_TYPE}'/${args.account ?? 0}'`;
149
+ }
150
+ /** Canonical raw address, `0:<hex>`. */
151
+ get address() {
152
+ return this._address;
153
+ }
154
+ addressUserFriendly(opts = {}) {
155
+ return new TonAddress(this._address).toUserFriendly(opts);
156
+ }
157
+ /** The code and data that deploy this wallet; attach while it is not deployed. */
158
+ get stateInit() {
159
+ return { code: this.contract.init.code, data: this.contract.init.data };
160
+ }
161
+ /**
162
+ * A request this wallet sends itself, as an external message. Pass `deploy`
163
+ * while the wallet is not deployed, so the message carries its StateInit.
164
+ *
165
+ * Every version sends external requests with "ignore errors" (+2) on every
166
+ * message (W5 forces it; v3r2 / v4r2 get it here), so a message that cannot
167
+ * be sent is skipped rather than failing the others — a v3r2 / v4r2
168
+ * request whose action phase failed would keep its seqno and could land
169
+ * again. v3r2 / v4r2 carry at most 4 messages.
170
+ */
171
+ createExternalRequest(args) {
172
+ const validUntil = args.validUntil ?? defaultValidUntil();
173
+ const body = this.contract instanceof WalletContractV5R1
174
+ ? this.contract.createRequest({
175
+ seqno: args.seqno,
176
+ timeout: validUntil,
177
+ secretKey: this.#secretKey,
178
+ authType: 'external',
179
+ actions: tonOutActions(args.messages),
180
+ })
181
+ : this.legacyExternalBody(args.seqno, validUntil, args.messages);
182
+ const message = external({ to: this.contract.address, init: args.deploy === true ? this.stateInit : undefined, body });
183
+ return {
184
+ boc: beginCell().store(storeMessage(message)).endCell().toBoc().toString('base64'),
185
+ hash: tonNormalizedExternalHash(this._address, body),
186
+ seqno: args.seqno,
187
+ validUntil,
188
+ };
189
+ }
190
+ /**
191
+ * A signed internal request (op `0x73696e74`) for a relayer to deliver with
192
+ * `tonRelayMessage` — the gasless path, where another account pays. W5
193
+ * (v5r1) only: v3r2 / v4r2 wallets accept requests only as external
194
+ * messages they pay for themselves. Send modes are kept as given, so
195
+ * without "ignore errors" the request's messages leave all together or not
196
+ * at all.
197
+ */
198
+ createInternalRequest(args) {
199
+ if (!(this.contract instanceof WalletContractV5R1)) {
200
+ throw new ChainError(ChainErrorKinds.FeatureNotSupported, `Relayed (gasless) requests need a W5 (v5r1) wallet; this one is ${this.version}`);
201
+ }
202
+ const validUntil = args.validUntil ?? defaultValidUntil();
203
+ const body = this.contract.createRequest({
204
+ seqno: args.seqno,
205
+ timeout: validUntil,
206
+ secretKey: this.#secretKey,
207
+ authType: 'internal',
208
+ actions: tonOutActions(args.messages),
209
+ });
210
+ return { body, seqno: args.seqno, validUntil };
211
+ }
212
+ /**
213
+ * A v3r2 / v4r2 signed body: the signature, then wallet id, valid_until,
214
+ * seqno, (v4r2: op 0, "send messages"), and each message with its own send
215
+ * mode (+2) — what `@ton/ton`'s transfers build, with per-message modes.
216
+ */
217
+ legacyExternalBody(seqno, validUntil, messages) {
218
+ if (messages.length > TON_LEGACY_MAX_MESSAGES) {
219
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `A ${this.version} request carries at most ${TON_LEGACY_MAX_MESSAGES} messages, got ${messages.length}`);
220
+ }
221
+ const signing = beginCell()
222
+ .storeUint(this.contract.walletId, 32)
223
+ .storeUint(validUntil, 32)
224
+ .storeUint(seqno, 32);
225
+ if (this.version === 'v4r2')
226
+ signing.storeUint(0, 8);
227
+ for (const action of tonOutActions(messages)) {
228
+ signing.storeUint(action.mode | SendMode.IGNORE_ERRORS, 8).storeRef(beginCell().store(storeMessageRelaxed(action.outMsg)).endCell());
229
+ }
230
+ const signature = sign(signing.endCell().hash(), this.#secretKey);
231
+ return beginCell().storeBuffer(signature).storeBuilder(signing).endCell();
232
+ }
233
+ /** Signs `transaction` as an external request, reading the seqno and deployment from `chain`. */
234
+ async signTransaction(transaction, chain) {
235
+ if (!(transaction instanceof TonUnsignedTransaction)) {
236
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Expected a TonUnsignedTransaction, got ${transaction.constructor.name}`);
237
+ }
238
+ if (new TonAddress(transaction.walletAddress).canonical() !== this._address) {
239
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Transaction is for ${transaction.walletAddress}, not this wallet ${this._address}`);
240
+ }
241
+ const tonChain = assertTonChain(chain);
242
+ if (tonChain.chainId !== transaction.chainId) {
243
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Transaction for chain ${transaction.chainId} cannot be signed on ${tonChain.chainId}`);
244
+ }
245
+ const seqno = await tonChain.getSeqno(this._address);
246
+ // At seqno 0 the wallet may have no code yet; a StateInit sent to a
247
+ // deployed wallet is ignored.
248
+ const request = this.createExternalRequest({ seqno, messages: transaction.messages, validUntil: transaction.validUntil, deploy: seqno === 0 });
249
+ return new TonSignedTransaction({ chainId: transaction.chainId, boc: request.boc });
250
+ }
251
+ /** An ed25519 signature over {@link tonMessageHash}, hex; never over the message's bytes, which could pass for a request hash. */
252
+ signMessage(message) {
253
+ return new TonSignedMessage(sign(tonMessageHash(message), this.#secretKey).toString('hex'));
254
+ }
255
+ verifySignature(message, signedMessage) {
256
+ return TonChain.verifySignature(this.publicKey, message, signedMessage);
257
+ }
258
+ async handleTransactionPrerequisite(prerequisite) {
259
+ throw new ChainError(ChainErrorKinds.FeatureNotSupported, `TonWallet has no transaction prerequisites (got ${prerequisite?.constructor?.name ?? typeof prerequisite})`);
260
+ }
261
+ static indexFromDerivationPath(derivationPath) {
262
+ const match = TON_DERIVATION_PATH_REGEX.exec(derivationPath);
263
+ if (match === null) {
264
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Invalid TON derivation path ${derivationPath}; expected m/44'/607'/<account>' (hardened, SLIP-0010)`);
265
+ }
266
+ return Number(match[1]);
267
+ }
268
+ }
269
+ function assertTonChain(chain) {
270
+ if (!(chain instanceof TonChain)) {
271
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Expected a TonChain, got ${chain.constructor.name}`);
272
+ }
273
+ return chain;
274
+ }
275
+ function defaultValidUntil() {
276
+ return Math.floor(Date.now() / 1000) + TON_DEFAULT_REQUEST_TTL_SECONDS;
277
+ }
278
+ //# sourceMappingURL=ton_wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ton_wallet.js","sourceRoot":"","sources":["../../../ton/ton_wallet.ts"],"names":[],"mappings":"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"}
package/docs/README.md CHANGED
@@ -37,7 +37,7 @@ mounted at each service's own `chain` directory.
37
37
  | **Solana** (mainnet, devnet, testnet) | [solana/](../solana) | `SolanaChain` over `@solana/web3.js` v1 + SPL Token / Token-2022 — see [solana.md](./solana.md) |
38
38
  | **Stellar** (mainnet, testnet) | [stellar/](../stellar) | `StellarChain` over `@stellar/stellar-sdk` (Horizon + Soroban RPC); import from `@getomnichain/omnichain/stellar` — see [stellar.md](./stellar.md) |
39
39
  | **Tron** (mainnet, Shasta) | [tron/](../tron) | `TronChain` over the TronGrid HTTP API (tronpy port); import from `@getomnichain/omnichain/tron` — see [tron.md](./tron.md) |
40
- | **TON** | [ton/](../ton) | `TonAddress` only (no full chain yet) |
40
+ | **TON** (mainnet) | [ton/](../ton) | `TonChain` over TON Center v3 with TonAPI as fallback, W5R1 wallets and relayed requests; import from `@getomnichain/omnichain/ton` — see [ton.md](./ton.md) |
41
41
 
42
42
  ## Quickstart
43
43
 
@@ -281,3 +281,4 @@ Add `Foo` enum value to [network_type.ts](../network_type.ts), create
281
281
  - [solana.md](./solana.md) — Solana, SPL Token, Token-2022, priority-fee model
282
282
  - [stellar.md](./stellar.md) — Stellar classic + Soroban, trustlines, SEP-5/SEP-53 wallet
283
283
  - [tron.md](./tron.md) — Tron TRX + TRC-20, energy fees, approvals, canonical transactions
284
+ - [ton.md](./ton.md) — TON and jettons, W5R1 wallets, relayed requests, trace emulation and status