This repository has been archived by the owner on Jan 26, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 19
/
WalletContractV2R1.ts
118 lines (107 loc) · 3.54 KB
/
WalletContractV2R1.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import { Address, beginCell, Cell, Contract, contractAddress, ContractProvider, internal, MessageRelaxed, Sender, SendMode } from "ton-core";
import { Maybe } from "../utils/maybe";
import { createWalletTransferV2 } from "./signing/createWalletTransfer";
export class WalletContractV2R1 implements Contract {
static create(args: { workchain: number, publicKey: Buffer }) {
return new WalletContractV2R1(args.workchain, args.publicKey);
}
readonly workchain: number;
readonly publicKey: Buffer;
readonly address: Address;
readonly init: { data: Cell, code: Cell };
private constructor(workchain: number, publicKey: Buffer) {
this.workchain = workchain;
this.publicKey = publicKey;
// Build initial code and data
let code = Cell.fromBoc(Buffer.from('te6cckEBAQEAVwAAqv8AIN0gggFMl7qXMO1E0NcLH+Ck8mCDCNcYINMf0x8B+CO78mPtRNDTH9P/0VExuvKhA/kBVBBC+RDyovgAApMg10qW0wfUAvsA6NGkyMsfy//J7VShNwu2', 'base64'))[0];
let data = beginCell()
.storeUint(0, 32) // Seqno
.storeBuffer(publicKey)
.endCell();
this.init = { code, data };
this.address = contractAddress(workchain, { code, data });
}
/**
* Get Wallet Balance
*/
async getBalance(provider: ContractProvider) {
let state = await provider.getState();
return state.balance;
}
/**
* Get Wallet Seqno
*/
async getSeqno(provider: ContractProvider) {
let state = await provider.getState();
if (state.state.type === 'active') {
let res = await provider.get('seqno', []);
return res.stack.readNumber();
} else {
return 0;
}
}
/**
* Send signed transfer
*/
async send(provider: ContractProvider, message: Cell) {
await provider.external(message);
}
/**
* Sign and send transfer
*/
async sendTransfer(provider: ContractProvider, args: {
seqno: number,
secretKey: Buffer,
messages: MessageRelaxed[],
sendMode?: Maybe<SendMode>,
timeout?: Maybe<number>
}) {
let transfer = this.createTransfer(args);
await this.send(provider, transfer);
}
/**
* Create signed transfer
*/
createTransfer(args: {
seqno: number,
secretKey: Buffer,
messages: MessageRelaxed[],
sendMode?: Maybe<SendMode>,
timeout?: Maybe<number>
}) {
let sendMode = SendMode.PAY_GAS_SEPARATLY;
if (args.sendMode !== null && args.sendMode !== undefined) {
sendMode = args.sendMode;
}
return createWalletTransferV2({
seqno: args.seqno,
sendMode,
secretKey: args.secretKey,
messages: args.messages,
timeout: args.timeout
});
}
/**
* Create sender
*/
sender(provider: ContractProvider, secretKey: Buffer): Sender {
return {
send: async (args) => {
let seqno = await this.getSeqno(provider);
let transfer = this.createTransfer({
seqno,
secretKey,
sendMode: args.sendMode,
messages: [internal({
to: args.to,
value: args.value,
init: args.init,
body: args.body,
bounce: args.bounce
})]
});
await this.send(provider, transfer);
}
};
}
}