UNPKG

@ton/ton

Version:

[![Version npm](https://img.shields.io/npm/v/ton.svg?logo=npm)](https://www.npmjs.com/package/ton)

227 lines (226 loc) 8.44 kB
"use strict"; /** * Copyright (c) Whales Corp. * All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.WalletContractV4 = void 0; const core_1 = require("@ton/core"); const createWalletTransfer_1 = require("../signing/createWalletTransfer"); class WalletContractV4 { static create(args) { return new WalletContractV4(args.workchain, args.publicKey, args.walletId); } constructor(workchain, publicKey, walletId) { // Resolve parameters this.workchain = workchain; this.publicKey = publicKey; if (walletId !== null && walletId !== undefined) { this.walletId = walletId; } else { this.walletId = 698983191 + workchain; } // Build initial code and data let code = core_1.Cell.fromBoc(Buffer.from('te6ccgECFAEAAtQAART/APSkE/S88sgLAQIBIAIDAgFIBAUE+PKDCNcYINMf0x/THwL4I7vyZO1E0NMf0x/T//QE0VFDuvKhUVG68qIF+QFUEGT5EPKj+AAkpMjLH1JAyx9SMMv/UhD0AMntVPgPAdMHIcAAn2xRkyDXSpbTB9QC+wDoMOAhwAHjACHAAuMAAcADkTDjDQOkyMsfEssfy/8QERITAubQAdDTAyFxsJJfBOAi10nBIJJfBOAC0x8hghBwbHVnvSKCEGRzdHK9sJJfBeAD+kAwIPpEAcjKB8v/ydDtRNCBAUDXIfQEMFyBAQj0Cm+hMbOSXwfgBdM/yCWCEHBsdWe6kjgw4w0DghBkc3RyupJfBuMNBgcCASAICQB4AfoA9AQw+CdvIjBQCqEhvvLgUIIQcGx1Z4MesXCAGFAEywUmzxZY+gIZ9ADLaRfLH1Jgyz8gyYBA+wAGAIpQBIEBCPRZMO1E0IEBQNcgyAHPFvQAye1UAXKwjiOCEGRzdHKDHrFwgBhQBcsFUAPPFiP6AhPLassfyz/JgED7AJJfA+ICASAKCwBZvSQrb2omhAgKBrkPoCGEcNQICEekk30pkQzmkD6f+YN4EoAbeBAUiYcVnzGEAgFYDA0AEbjJftRNDXCx+AA9sp37UTQgQFA1yH0BDACyMoHy//J0AGBAQj0Cm+hMYAIBIA4PABmtznaiaEAga5Drhf/AABmvHfaiaEAQa5DrhY/AAG7SB/oA1NQi+QAFyMoHFcv/ydB3dIAYyMsFywIizxZQBfoCFMtrEszMyXP7AMhAFIEBCPRR8qcCAHCBAQjXGPoA0z/IVCBHgQEI9FHyp4IQbm90ZXB0gBjIywXLAlAGzxZQBPoCFMtqEssfyz/Jc/sAAgBsgQEI1xj6ANM/MFIkgQEI9Fnyp4IQZHN0cnB0gBjIywXLAlAFzxZQA/oCE8tqyx8Syz/Jc/sAAAr0AMntVA==', 'base64'))[0]; let data = (0, core_1.beginCell)() .storeUint(0, 32) // Seqno .storeUint(this.walletId, 32) .storeBuffer(this.publicKey) .storeBit(0) // Empty plugins dict .endCell(); this.init = { code, data }; this.address = (0, core_1.contractAddress)(workchain, { code, data }); } /** * Get Wallet Balance */ async getBalance(provider) { let state = await provider.getState(); return state.balance; } /** * Get Wallet Seqno */ async getSeqno(provider) { let state = await provider.getState(); if (state.state.type === 'active') { let res = await provider.get('seqno', []); return res.stack.readNumber(); } else { return 0; } } async getIsPluginInstalled(provider, pluginAddress) { const state = await provider.getState(); if (state.state.type !== 'active') { return false; } const wc = BigInt(pluginAddress.workChain); const addrHash = BigInt('0x' + pluginAddress.hash.toString('hex')); const res = await provider.get('is_plugin_installed', [ { type: 'int', value: wc }, { type: 'int', value: addrHash } ]); return res.stack.readBoolean(); } async getPluginsArray(provider) { const state = await provider.getState(); if (state.state.type !== 'active') { return []; } const res = await provider.get('get_plugin_list', []); return res.stack.readLispList().map(item => { if (item.type !== 'tuple') { throw Error('Not a tuple'); } const entry = new core_1.TupleReader(item.items); const workchain = entry.readNumber(); const addrHash = entry.readBigNumber(); const addressHex = addrHash.toString(16).padStart(64, '0'); return core_1.Address.parseRaw(`${workchain}:${addressHex}`); }); } /** * Send signed transfer */ async send(provider, message) { await provider.external(message); } /** * Sign and send transfer */ async sendTransfer(provider, args) { let transfer = this.createTransfer(args); await this.send(provider, transfer); } /** * Create signed transfer */ createTransfer(args) { return this.createRequest({ seqno: args.seqno, timeout: args.timeout, action: { type: 'sendMsg', messages: args.messages, sendMode: args.sendMode, }, ...('secretKey' in args ? { secretKey: args.secretKey } : { signer: args.signer }) }); } async sendRequest(provider, args) { const action = await this.createRequest(args); await this.send(provider, action); } createRequest(args) { return (0, createWalletTransfer_1.createWalletTransferV4)({ ...args, walletId: this.walletId }); } /** * Create sender */ sender(provider, secretKey) { return { send: async (args) => { let seqno = await this.getSeqno(provider); let transfer = this.createTransfer({ seqno, secretKey, sendMode: args.sendMode, messages: [(0, core_1.internal)({ to: args.to, value: args.value, extracurrency: args.extracurrency, init: args.init, body: args.body, bounce: args.bounce })] }); await this.send(provider, transfer); } }; } async sendAddPlugin(provider, args) { const request = await this.createAddPlugin(args); return await this.send(provider, request); } async sendRemovePlugin(provider, args) { const request = await this.createRemovePlugin(args); return await this.send(provider, request); } async sendAddAndDeployPlugin(provider, args) { const request = await this.createAddAndDeployPlugin(args); return await this.send(provider, request); } createAddPlugin(args) { return this.createRequest({ action: { type: 'addPlugin', address: args.address, forwardAmount: args.forwardAmount, queryId: args.queryId, }, ...args }); } createRemovePlugin(args) { return this.createRequest({ action: { type: 'removePlugin', address: args.address, forwardAmount: args.forwardAmount, queryId: args.queryId, }, ...args }); } createAddAndDeployPlugin(args) { return this.createRequest({ action: { type: 'addAndDeployPlugin', workchain: args.workchain, stateInit: args.stateInit, body: args.body, forwardAmount: args.forwardAmount }, ...args }); } async sendPluginRequestFunds(provider, sender, args) { await provider.internal(sender, { value: args.forwardAmount, body: this.createPluginRequestFundsMessage(args), sendMode: args.sendMode }); } createPluginRequestFundsMessage(args) { return (0, core_1.beginCell)() .storeUint(0x706c7567, 32) .storeUint(args.queryId ?? 0, 64) .storeCoins(args.toncoinsToWithdraw) .storeDict(null) .endCell(); } async sendPluginRemovePlugin(provider, sender, amount, queryId) { await provider.internal(sender, { value: amount, body: this.createPluginRemovePluginMessage(queryId), }); } createPluginRemovePluginMessage(queryId) { return (0, core_1.beginCell)() .storeUint(0x64737472, 32) .storeUint(queryId ?? 0, 64) .endCell(); } } exports.WalletContractV4 = WalletContractV4;