@ton/ton
Version:
[](https://www.npmjs.com/package/ton)
227 lines (226 loc) • 8.44 kB
JavaScript
"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;