-
Notifications
You must be signed in to change notification settings - Fork 669
/
wallet_client.go
154 lines (141 loc) · 4.16 KB
/
wallet_client.go
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Copyright (C) 2019-2023, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package avm
import (
"context"
"fmt"
"github.com/ava-labs/avalanchego/api"
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/utils/constants"
"github.com/ava-labs/avalanchego/utils/formatting"
"github.com/ava-labs/avalanchego/utils/json"
"github.com/ava-labs/avalanchego/utils/rpc"
)
var _ WalletClient = (*client)(nil)
// interface of an AVM wallet client for interacting with avm managed wallet on [chain]
type WalletClient interface {
// IssueTx issues a transaction to a node and returns the TxID
IssueTx(ctx context.Context, tx []byte, options ...rpc.Option) (ids.ID, error)
// Send [amount] of [assetID] to address [to]
//
// Deprecated: Transactions should be issued using the
// `avalanchego/wallet/chain/x.Wallet` utility.
Send(
ctx context.Context,
user api.UserPass,
from []ids.ShortID,
changeAddr ids.ShortID,
amount uint64,
assetID string,
to ids.ShortID,
memo string,
options ...rpc.Option,
) (ids.ID, error)
// SendMultiple sends a transaction from [user] funding all [outputs]
//
// Deprecated: Transactions should be issued using the
// `avalanchego/wallet/chain/x.Wallet` utility.
SendMultiple(
ctx context.Context,
user api.UserPass,
from []ids.ShortID,
changeAddr ids.ShortID,
outputs []ClientSendOutput,
memo string,
options ...rpc.Option,
) (ids.ID, error)
}
// implementation of an AVM wallet client for interacting with avm managed wallet on [chain]
type walletClient struct {
requester rpc.EndpointRequester
}
// NewWalletClient returns an AVM wallet client for interacting with avm managed wallet on [chain]
//
// Deprecated: Transactions should be issued using the
// `avalanchego/wallet/chain/x.Wallet` utility.
func NewWalletClient(uri, chain string) WalletClient {
path := fmt.Sprintf(
"%s/ext/%s/%s/wallet",
uri,
constants.ChainAliasPrefix,
chain,
)
return &walletClient{
requester: rpc.NewEndpointRequester(path),
}
}
func (c *walletClient) IssueTx(ctx context.Context, txBytes []byte, options ...rpc.Option) (ids.ID, error) {
txStr, err := formatting.Encode(formatting.Hex, txBytes)
if err != nil {
return ids.ID{}, err
}
res := &api.JSONTxID{}
err = c.requester.SendRequest(ctx, "wallet.issueTx", &api.FormattedTx{
Tx: txStr,
Encoding: formatting.Hex,
}, res, options...)
return res.TxID, err
}
// ClientSendOutput specifies that [Amount] of asset [AssetID] be sent to [To]
type ClientSendOutput struct {
// The amount of funds to send
Amount uint64
// ID of the asset being sent
AssetID string
// Address of the recipient
To ids.ShortID
}
func (c *walletClient) Send(
ctx context.Context,
user api.UserPass,
from []ids.ShortID,
changeAddr ids.ShortID,
amount uint64,
assetID string,
to ids.ShortID,
memo string,
options ...rpc.Option,
) (ids.ID, error) {
res := &api.JSONTxID{}
err := c.requester.SendRequest(ctx, "wallet.send", &SendArgs{
JSONSpendHeader: api.JSONSpendHeader{
UserPass: user,
JSONFromAddrs: api.JSONFromAddrs{From: ids.ShortIDsToStrings(from)},
JSONChangeAddr: api.JSONChangeAddr{ChangeAddr: changeAddr.String()},
},
SendOutput: SendOutput{
Amount: json.Uint64(amount),
AssetID: assetID,
To: to.String(),
},
Memo: memo,
}, res, options...)
return res.TxID, err
}
func (c *walletClient) SendMultiple(
ctx context.Context,
user api.UserPass,
from []ids.ShortID,
changeAddr ids.ShortID,
outputs []ClientSendOutput,
memo string,
options ...rpc.Option,
) (ids.ID, error) {
res := &api.JSONTxID{}
serviceOutputs := make([]SendOutput, len(outputs))
for i, output := range outputs {
serviceOutputs[i].Amount = json.Uint64(output.Amount)
serviceOutputs[i].AssetID = output.AssetID
serviceOutputs[i].To = output.To.String()
}
err := c.requester.SendRequest(ctx, "wallet.sendMultiple", &SendMultipleArgs{
JSONSpendHeader: api.JSONSpendHeader{
UserPass: user,
JSONFromAddrs: api.JSONFromAddrs{From: ids.ShortIDsToStrings(from)},
JSONChangeAddr: api.JSONChangeAddr{ChangeAddr: changeAddr.String()},
},
Outputs: serviceOutputs,
Memo: memo,
}, res, options...)
return res.TxID, err
}