Skip to content

Commit 27eaec5

Browse files
Export wallet v5
1 parent 1d64f6a commit 27eaec5

File tree

8 files changed

+83
-32
lines changed

8 files changed

+83
-32
lines changed

wallet/models_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package wallet
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestVersion_ToString(t *testing.T) {
8+
for ver := range codes {
9+
ver.ToString()
10+
11+
}
12+
if got := tt.v.ToString(); got != tt.want {
13+
t.Errorf("ToString() = %v, want %v", got, tt.want)
14+
}
15+
}

wallet/wallet.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func newWallet(key ed25519.PublicKey, version Version, options Options) (wallet,
109109
case V4R1, V4R2:
110110
return newWalletV4(version, key, options), nil
111111
case V5Beta:
112-
return newWalletV5(version, key, options), nil
112+
return NewWalletV5Beta(version, key, options), nil
113113
case HighLoadV2R2:
114114
return newWalletHighloadV2(version, key, options), nil
115115
default:
@@ -258,7 +258,7 @@ func (w *Wallet) SendV2(ctx context.Context, waitingConfirmation time.Duration,
258258
if err != nil {
259259
return ton.Bits256{}, fmt.Errorf("get account state failed: %v", err)
260260
}
261-
params, err := w.intWallet.nextMessageParams(state)
261+
params, err := w.intWallet.NextMessageParams(state)
262262
if err != nil {
263263
return ton.Bits256{}, err
264264
}

wallet/wallet_highload_v2.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,14 @@ func (w *walletHighloadV2) createSignedMsgBodyCell(privateKey ed25519.PrivateKey
7171
return signBodyCell(*bodyCell, privateKey)
7272
}
7373

74-
func (w *walletHighloadV2) nextMessageParams(state tlb.ShardAccount) (nextMsgParams, error) {
74+
func (w *walletHighloadV2) NextMessageParams(state tlb.ShardAccount) (NextMsgParams, error) {
7575
initRequired := state.Account.Status() == tlb.AccountUninit || state.Account.Status() == tlb.AccountNone
7676
if !initRequired {
77-
return nextMsgParams{}, nil
77+
return NextMsgParams{}, nil
7878
}
7979
stateInit, err := w.generateStateInit()
8080
if err != nil {
81-
return nextMsgParams{}, err
81+
return NextMsgParams{}, err
8282
}
83-
return nextMsgParams{Init: stateInit}, nil
83+
return NextMsgParams{Init: stateInit}, nil
8484
}

wallet/wallet_v1v2.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,6 @@ func (w *walletV1V2) createSignedMsgBodyCell(privateKey ed25519.PrivateKey, inte
5454
panic("implement me")
5555
}
5656

57-
func (w *walletV1V2) nextMessageParams(state tlb.ShardAccount) (nextMsgParams, error) {
57+
func (w *walletV1V2) NextMessageParams(state tlb.ShardAccount) (NextMsgParams, error) {
5858
panic("implement me")
5959
}

wallet/wallet_v3.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,20 @@ func (w *walletV3) createSignedMsgBodyCell(privateKey ed25519.PrivateKey, intern
6969
return signBodyCell(*bodyCell, privateKey)
7070
}
7171

72-
func (w *walletV3) nextMessageParams(state tlb.ShardAccount) (nextMsgParams, error) {
72+
func (w *walletV3) NextMessageParams(state tlb.ShardAccount) (NextMsgParams, error) {
7373
if state.Account.Status() == tlb.AccountActive {
7474
var data DataV3
7575
cell := boc.Cell(state.Account.Account.Storage.State.AccountActive.StateInit.Data.Value.Value)
7676
if err := tlb.Unmarshal(&cell, &data); err != nil {
77-
return nextMsgParams{}, err
77+
return NextMsgParams{}, err
7878
}
79-
return nextMsgParams{
79+
return NextMsgParams{
8080
Seqno: data.Seqno,
8181
}, nil
8282
}
8383
init, err := w.generateStateInit()
8484
if err != nil {
85-
return nextMsgParams{}, err
85+
return NextMsgParams{}, err
8686
}
87-
return nextMsgParams{Init: init}, nil
87+
return NextMsgParams{Init: init}, nil
8888
}

wallet/wallet_v4.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,20 +72,20 @@ func (w *walletV4) createSignedMsgBodyCell(privateKey ed25519.PrivateKey, intern
7272
return signBodyCell(*bodyCell, privateKey)
7373
}
7474

75-
func (w *walletV4) nextMessageParams(state tlb.ShardAccount) (nextMsgParams, error) {
75+
func (w *walletV4) NextMessageParams(state tlb.ShardAccount) (NextMsgParams, error) {
7676
if state.Account.Status() == tlb.AccountActive {
7777
var data DataV4
7878
cell := boc.Cell(state.Account.Account.Storage.State.AccountActive.StateInit.Data.Value.Value)
7979
if err := tlb.Unmarshal(&cell, &data); err != nil {
80-
return nextMsgParams{}, err
80+
return NextMsgParams{}, err
8181
}
82-
return nextMsgParams{
82+
return NextMsgParams{
8383
Seqno: data.Seqno,
8484
}, nil
8585
}
8686
init, err := w.generateStateInit()
8787
if err != nil {
88-
return nextMsgParams{}, err
88+
return NextMsgParams{}, err
8989
}
90-
return nextMsgParams{Init: init}, nil
90+
return NextMsgParams{Init: init}, nil
9191
}

wallet/wallet_v5.go

Lines changed: 49 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ type DataV5 struct {
2323
Extensions tlb.HashmapE[tlb.Bits256, tlb.Uint8]
2424
}
2525

26-
type walletV5 struct {
26+
type walletV5Beta struct {
2727
version Version
2828
publicKey ed25519.PublicKey
2929
workchain int
@@ -45,14 +45,14 @@ type MessageConfigV5 struct {
4545
MsgType V5MsgType
4646
}
4747

48-
var _ wallet = &walletV5{}
48+
var _ wallet = &walletV5Beta{}
4949

50-
func newWalletV5(version Version, publicKey ed25519.PublicKey, opts Options) *walletV5 {
50+
func NewWalletV5Beta(version Version, publicKey ed25519.PublicKey, opts Options) *walletV5Beta {
5151
workchain := defaultOr(opts.Workchain, 0)
5252
subWalletID := defaultOr(opts.SubWalletID, 0)
5353

5454
networkGlobalID := defaultOr[int32](opts.NetworkGlobalID, MainnetGlobalID)
55-
return &walletV5{
55+
return &walletV5Beta{
5656
version: version,
5757
publicKey: publicKey,
5858
workchain: workchain,
@@ -61,15 +61,15 @@ func newWalletV5(version Version, publicKey ed25519.PublicKey, opts Options) *wa
6161
}
6262
}
6363

64-
func (w *walletV5) generateAddress() (ton.AccountID, error) {
64+
func (w *walletV5Beta) generateAddress() (ton.AccountID, error) {
6565
stateInit, err := w.generateStateInit()
6666
if err != nil {
6767
return ton.AccountID{}, fmt.Errorf("can not generate state init: %v", err)
6868
}
6969
return generateAddress(w.workchain, *stateInit)
7070
}
7171

72-
func (w *walletV5) generateStateInit() (*tlb.StateInit, error) {
72+
func (w *walletV5Beta) generateStateInit() (*tlb.StateInit, error) {
7373
data := DataV5{
7474
Seqno: 0,
7575
WalletID: WalletV5ID{
@@ -82,26 +82,26 @@ func (w *walletV5) generateStateInit() (*tlb.StateInit, error) {
8282
return generateStateInit(w.version, data)
8383
}
8484

85-
func (w *walletV5) maxMessageNumber() int {
85+
func (w *walletV5Beta) maxMessageNumber() int {
8686
return 254
8787
}
8888

89-
func (w *walletV5) nextMessageParams(state tlb.ShardAccount) (nextMsgParams, error) {
89+
func (w *walletV5Beta) NextMessageParams(state tlb.ShardAccount) (NextMsgParams, error) {
9090
if state.Account.Status() == tlb.AccountActive {
9191
var data DataV5
9292
cell := boc.Cell(state.Account.Account.Storage.State.AccountActive.StateInit.Data.Value.Value)
9393
if err := tlb.Unmarshal(&cell, &data); err != nil {
94-
return nextMsgParams{}, err
94+
return NextMsgParams{}, err
9595
}
96-
return nextMsgParams{
96+
return NextMsgParams{
9797
Seqno: uint32(data.Seqno),
9898
}, nil
9999
}
100100
init, err := w.generateStateInit()
101101
if err != nil {
102-
return nextMsgParams{}, err
102+
return NextMsgParams{}, err
103103
}
104-
return nextMsgParams{Init: init}, nil
104+
return NextMsgParams{Init: init}, nil
105105

106106
}
107107

@@ -113,7 +113,43 @@ type extSignedMessage struct {
113113
Actions SendMessageList `tlb:"^"`
114114
}
115115

116-
func (w *walletV5) createSignedMsgBodyCell(privateKey ed25519.PrivateKey, internalMessages []RawMessage, msgConfig MessageConfig) (*boc.Cell, error) {
116+
func (w *walletV5Beta) CreateMsgBodyWithoutSignature(internalMessages []RawMessage, msgConfig MessageConfig) (*boc.Cell, error) {
117+
actions := SendMessageList{
118+
Actions: make([]SendMessageAction, 0, len(internalMessages)),
119+
}
120+
for _, msg := range internalMessages {
121+
actions.Actions = append(actions.Actions, SendMessageAction{
122+
Msg: msg.Message,
123+
Mode: msg.Mode,
124+
})
125+
}
126+
msg := extSignedMessage{
127+
WalletId: WalletV5ID{
128+
NetworkGlobalID: w.networkGlobalID,
129+
Workchain: uint8(w.workchain),
130+
SubWalletID: w.subWalletID,
131+
},
132+
ValidUntil: uint32(msgConfig.ValidUntil.Unix()),
133+
Seqno: msgConfig.Seqno,
134+
Op: false,
135+
Actions: actions,
136+
}
137+
bodyCell := boc.NewCell()
138+
if err := bodyCell.WriteUint(uint64(msgConfig.V5MsgType), 32); err != nil {
139+
return nil, err
140+
}
141+
if err := tlb.Marshal(bodyCell, msg); err != nil {
142+
return nil, err
143+
}
144+
bytes := [64]byte{}
145+
if err := bodyCell.WriteBytes(bytes[:]); err != nil {
146+
return nil, err
147+
}
148+
return bodyCell, nil
149+
150+
}
151+
152+
func (w *walletV5Beta) createSignedMsgBodyCell(privateKey ed25519.PrivateKey, internalMessages []RawMessage, msgConfig MessageConfig) (*boc.Cell, error) {
117153
actions := SendMessageList{
118154
Actions: make([]SendMessageAction, 0, len(internalMessages)),
119155
}

wallet/wallets_common.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"github.com/tonkeeper/tongo/ton"
1010
)
1111

12-
type nextMsgParams struct {
12+
type NextMsgParams struct {
1313
Seqno uint32
1414
Init *tlb.StateInit
1515
}
@@ -19,7 +19,7 @@ type wallet interface {
1919
generateStateInit() (*tlb.StateInit, error)
2020
maxMessageNumber() int
2121
createSignedMsgBodyCell(privateKey ed25519.PrivateKey, internalMessages []RawMessage, msgConfig MessageConfig) (*boc.Cell, error)
22-
nextMessageParams(state tlb.ShardAccount) (nextMsgParams, error)
22+
NextMessageParams(state tlb.ShardAccount) (NextMsgParams, error)
2323
}
2424

2525
func defaultOr[T any](value *T, defaultValue T) T {

0 commit comments

Comments
 (0)