go-substrate-rpc-client icon indicating copy to clipboard operation
go-substrate-rpc-client copied to clipboard

Can sign and send transactions to moonbeam?

Open YuXiaoCoder opened this issue 1 year ago • 2 comments
trafficstars

How do I sign and send a transaction to Moonbeam, I understand Polkadot's method!

// Transfer 转账 https://kusama.subscan.io/extrinsic?module=Balances&call=transfer_keep_alive
func (service *Service) Transfer(signer Signer, to types.AccountID, amount uint64) *types.Hash {
	// 获取元数据信息
	metadata := service.GetMetadata()
	if metadata == nil {
		return nil
	}

	toMultiAddress, err := types.NewMultiAddressFromAccountID(to.ToBytes())
	if err != nil {
		zap.S().Warnf("failed to get to [%v] multi address, err: %v", to.ToHexString(), err)
		return nil
	}

	// Transfer Call
	transferCall, err := types.NewCall(metadata, "Balances.transfer_keep_alive", toMultiAddress, types.NewUCompactFromUInt(amount))
	if err != nil {
		zap.S().Warnf("failed to new Balances.transfer_keep_alive call, err: %v", err)
		return nil
	}

	// Extrinsic
	extrinsic := types.NewExtrinsic(transferCall)

	if signer.IsProxy {
		proxyType := signer.ProxyType
		realAccount := signer.RealAccountId

		// 获取被代理账户的账户 ID
		realMultiAddress, err := types.NewMultiAddressFromAccountID(realAccount.ToBytes())
		if err != nil {
			zap.S().Warnf("failed to get real [%v] multi address, err: %v", realAccount.ToHexString(), err)
			return nil
		}

		call, err := types.NewCall(metadata, "Proxy.proxy", realMultiAddress, types.NewOption[byte](byte(proxyType)), transferCall)
		if err != nil {
			zap.S().Warnf("failed to new Proxy.proxy call, err: %v", err)
			return nil
		}

		// Extrinsic
		extrinsic = types.NewExtrinsic(call)
	}
	extrinsicByte, err := extrinsic.MarshalJSON()
	if err != nil {
		zap.S().Warnf("failed to unmarshal extrinsic, err: %v", err)
		return nil
	}
	zap.S().Infof("singer: %v, real account: %v, extrinsic: %v\n", signer.Origin.Address, signer.RealAccountId.ToHexString(), FormatExtrinsic(extrinsicByte))

	// 获取签名配置
	options := service.GetSignatureOptions(signer.Origin.PublicKey)
	if options == nil {
		return nil
	}

	// 对交易体签名
	err = extrinsic.Sign(signer.Origin, *options)
	if err != nil {
		zap.S().Warnf("failed to sign extrinsic, err: %v", err)
		return nil
	}

	// 提交交易并返回交易哈希
	txHash, err := service.Api.RPC.Author.SubmitExtrinsic(extrinsic)
	if err != nil {
		zap.S().Warnf("failed to submit extrinsic, err: %v", err)
		return nil
	}
	return &txHash
}

// 从助记词派生出密钥对
keypair, err := signature.KeyringPairFromSecret(mnemonic+derivationPath, uint16(networkId))
if err != nil {
        zap.S().Warnf("failed to derive key pair: %v", err)
        return nil
}

YuXiaoCoder avatar Aug 26 '24 11:08 YuXiaoCoder