| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- 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
- }
|