func (tx *SendTx) SignInput(chainID string, i int, privAccount *acm.PrivAccount) error { if i >= len(tx.Inputs) { return fmt.Errorf("Index %v is greater than number of inputs (%v)", i, len(tx.Inputs)) } tx.Inputs[i].PubKey = privAccount.PubKey tx.Inputs[i].Signature = privAccount.Sign(chainID, tx) return nil }
func (tx *BondTx) SignBond(chainID string, privAccount *acm.PrivAccount) error { sig := privAccount.Sign(chainID, tx) sigEd, ok := sig.(acm.SignatureEd25519) if !ok { return fmt.Errorf("Bond signer must be ED25519") } tx.Signature = sigEd return nil }
func (tx *CallTx) Sign(chainID string, privAccount *acm.PrivAccount) { tx.Input.PubKey = privAccount.PubKey tx.Input.Signature = privAccount.Sign(chainID, tx) }
func (tx *RebondTx) Sign(chainID string, privAccount *acm.PrivAccount) { tx.Signature = privAccount.Sign(chainID, tx).(acm.SignatureEd25519) }
func send_tx() { // Get PrivAccount var privAccount *acm.PrivAccount secret := getString("Enter your secret, or just hit <Enter> to enter a private key in HEX.\n> ") if secret == "" { privKeyBytes := getByteSliceFromHex("Enter your private key in HEX (e.g. E353CAD81134A301A542AEBE2D2E4EF1A64A145117EC72743AE9C9D171A4AA69F3A7DD670A9E9307AAED000D97D5B3C07D90276BFCEEDA5ED11DA089A4E87A81):\n> ") privAccount = acm.GenPrivAccountFromPrivKeyBytes(privKeyBytes) } else { // Auto-detect private key hex if len(secret) == 128 { privKeyBytes, err := hex.DecodeString(secret) if err == nil { fmt.Println("Detected priv-key bytes...") privAccount = acm.GenPrivAccountFromPrivKeyBytes(privKeyBytes) } else { fmt.Println("That's a long seed...") privAccount = acm.GenPrivAccountFromSecret(secret) } } else { privAccount = acm.GenPrivAccountFromSecret(secret) } } pubKey := privAccount.PubKey // Get account data cli := cclient.NewClient("http://localhost:46657", "JSONRPC") res, err := cli.GetAccount(privAccount.Address) if err != nil { Exit(Fmt("Error fetching account: %v", err)) } if res == nil { Exit(Fmt("No account was found with that secret/private-key")) } inputAcc := res.Account fmt.Printf(` Source account: Address: %X PubKey: %v Sequence: %v Balance: %v Permissions: %v `, inputAcc.Address, pubKey, inputAcc.Sequence, inputAcc.Balance, inputAcc.Permissions) output := getByteSliceFromHex("\nEnter the output address in HEX:\n> ") amount := getInt64("Enter the amount to send:\n> ") // Construct transaction tx := types.NewSendTx() tx.AddInputWithNonce(pubKey, amount, inputAcc.Sequence+1) tx.AddOutput(output, amount) tx.Inputs[0].Signature = privAccount.Sign(config.GetString("chain_id"), tx) fmt.Println("Signed SendTx!: ", tx) // Sign up for events wsCli := cclient.NewWSClient("ws://localhost:46657/websocket") wsCli.Start() err = wsCli.Subscribe(types.EventStringAccInput(inputAcc.Address)) if err != nil { Exit(Fmt("Error subscribing to account send event: %v", err)) } // Broadcast transaction _, err = cli.BroadcastTx(tx) if err != nil { Exit(Fmt("Error broadcasting transaction: %v", err)) } fmt.Println("Waiting for confirmation...") _ = <-wsCli.EventsCh fmt.Println("Confirmed.") }