func TestHexdataPtrAddress(t *testing.T) { in := common.Address{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19} v := newHexData(&in) if bytes.Compare(in.Bytes(), v.data) != 0 { t.Errorf("Got % x expected % x", in, v.data) } }
func (self *XEth) doSign(from common.Address, hash common.Hash, didUnlock bool) ([]byte, error) { sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from}, hash.Bytes()) if err == accounts.ErrLocked { if didUnlock { return nil, fmt.Errorf("signer account still locked after successful unlock") } if !self.frontend.UnlockAccount(from.Bytes()) { return nil, fmt.Errorf("could not unlock signer account") } // retry signing, the account should now be unlocked. return self.doSign(from, hash, true) } else if err != nil { return nil, err } return sig, nil }
func (self *XEth) sign(tx *types.Transaction, from common.Address, didUnlock bool) error { sig, err := self.backend.AccountManager().Sign(accounts.Account{Address: from.Bytes()}, tx.Hash().Bytes()) if err == accounts.ErrLocked { if didUnlock { return fmt.Errorf("sender account still locked after successful unlock") } if !self.frontend.UnlockAccount(from.Bytes()) { return fmt.Errorf("could not unlock sender account") } // retry signing, the account should now be unlocked. return self.sign(tx, from, true) } else if err != nil { return err } tx.SetSignatureValues(sig) return nil }
// Transfer initiates a value transfer from an origin account to a destination // account. func (eapis *EtherAPIs) Transfer(from, to common.Address, amount *big.Int) (common.Hash, error) { // Make sure we actually own the origin account and have a valid destination accman := eapis.ethereum.AccountManager() if !accman.HasAccount(from) { return common.Hash{}, fmt.Errorf("unknown account: 0x%x", from.Bytes()) } if to == (common.Address{}) { return common.Hash{}, fmt.Errorf("missing destination account") } // Serialize transaction creations to avoid nonce clashes eapis.txlock.Lock() defer eapis.txlock.Unlock() // Assemble and create the new transaction var ( txpool = eapis.ethereum.TxPool() nonce = txpool.State().GetNonce(from) gasLimit = params.TxGas gasPrice = eapis.ethereum.GpoMinGasPrice ) tx := types.NewTransaction(nonce, to, amount, gasLimit, gasPrice, nil) // Sign the transaction and inject into the local pool for propagation signature, err := accman.Sign(accounts.Account{Address: from}, tx.SigHash().Bytes()) if err != nil { return common.Hash{}, err } signed, err := tx.WithSignature(signature) if err != nil { return common.Hash{}, err } txpool.SetLocal(signed) if err := txpool.Add(signed); err != nil { return common.Hash{}, err } return signed.Hash(), nil }