wormhole/node/pkg/terra/sender.go

99 lines
2.1 KiB
Go

package terra
import (
"context"
"encoding/json"
"io/ioutil"
"time"
"github.com/terra-project/terra.go/client"
"github.com/terra-project/terra.go/key"
"github.com/terra-project/terra.go/msg"
"github.com/terra-project/terra.go/tx"
"github.com/certusone/wormhole/node/pkg/vaa"
)
type submitVAAMsg struct {
Params submitVAAParams `json:"submit_v_a_a"`
}
type submitVAAParams struct {
VAA []byte `json:"vaa"`
}
// SubmitVAA prepares transaction with signed VAA and sends it to the Terra blockchain
func SubmitVAA(ctx context.Context, urlLCD string, chainID string, contractAddress string, feePayer string, signed *vaa.VAA) (*client.TxResponse, error) {
// Serialize VAA
vaaBytes, err := signed.Marshal()
if err != nil {
return nil, err
}
// Derive Raw Private Key
privKey, err := key.DerivePrivKey(feePayer, key.CreateHDPath(0, 0))
if err != nil {
return nil, err
}
// Generate StdPrivKey
tmKey, err := key.StdPrivKeyGen(privKey)
if err != nil {
return nil, err
}
// Generate Address from Public Key
addr := msg.AccAddress(tmKey.PubKey().Address())
// Create LCDClient
LCDClient := client.NewLCDClient(
urlLCD,
chainID,
msg.NewDecCoinFromDec("uusd", msg.NewDecFromIntWithPrec(msg.NewInt(15), 2)), // 0.15uusd
msg.NewDecFromIntWithPrec(msg.NewInt(15), 1), tmKey, time.Second*15,
)
contract, err := msg.AccAddressFromBech32(contractAddress)
if err != nil {
return nil, err
}
// Create tx
contractCall, err := json.Marshal(submitVAAMsg{
Params: submitVAAParams{
VAA: vaaBytes,
}})
if err != nil {
return nil, err
}
executeContract := msg.NewExecuteContract(addr, contract, contractCall, msg.NewCoins())
transaction, err := LCDClient.CreateAndSignTx(ctx, client.CreateTxOptions{
Msgs: []msg.Msg{
executeContract,
},
Fee: tx.StdFee{
Gas: msg.NewInt(0),
Amount: msg.NewCoins(),
},
})
if err != nil {
return nil, err
}
// Broadcast
return LCDClient.Broadcast(ctx, transaction)
}
// ReadKey reads file and returns its content as a string
func ReadKey(path string) (string, error) {
b, err := ioutil.ReadFile(path)
if err != nil {
return "", err
}
return string(b), nil
}