Add type tag to transaction struct and move call example
This commit is contained in:
@@ -26,6 +26,7 @@ func main() {
|
|||||||
fmt.Println(signerAccount.Address)
|
fmt.Println(signerAccount.Address)
|
||||||
|
|
||||||
simpleTransaction(ctx, client, signerAccount)
|
simpleTransaction(ctx, client, signerAccount)
|
||||||
|
// moveCallTransaction(ctx, client, signerAccount)
|
||||||
// TODO: sponsored transaction not work now
|
// TODO: sponsored transaction not work now
|
||||||
// sponsoredTransaction(ctx, client, signerAccount)
|
// sponsoredTransaction(ctx, client, signerAccount)
|
||||||
}
|
}
|
||||||
@@ -94,6 +95,88 @@ func simpleTransaction(ctx context.Context, suiClient *sui.Client, signer *signe
|
|||||||
fmt.Println(resp.Digest, resp.Effects, resp.Results)
|
fmt.Println(resp.Digest, resp.Effects, resp.Results)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func moveCallTransaction(ctx context.Context, suiClient *sui.Client, signer *signer.Signer) {
|
||||||
|
gasCoinObjectId := ""
|
||||||
|
|
||||||
|
gasCoinObj, err := suiClient.SuiGetObject(ctx, models.SuiGetObjectRequest{
|
||||||
|
ObjectId: gasCoinObjectId,
|
||||||
|
Options: models.SuiObjectDataOptions{
|
||||||
|
ShowContent: true,
|
||||||
|
ShowDisplay: true,
|
||||||
|
ShowType: true,
|
||||||
|
ShowBcs: true,
|
||||||
|
ShowOwner: true,
|
||||||
|
ShowPreviousTransaction: true,
|
||||||
|
ShowStorageRebate: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
version, err := strconv.ParseUint(gasCoinObj.Data.Version, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
gasCoin, err := transaction.NewSuiObjectRef(
|
||||||
|
models.SuiAddress(gasCoinObjectId),
|
||||||
|
version,
|
||||||
|
models.ObjectDigest(gasCoinObj.Data.Digest),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
tx := transaction.NewTransaction()
|
||||||
|
|
||||||
|
tx.SetSuiClient(suiClient).
|
||||||
|
SetSigner(signer).
|
||||||
|
SetSender(models.SuiAddress(signer.Address)).
|
||||||
|
SetGasPrice(1000).
|
||||||
|
SetGasBudget(50000000).
|
||||||
|
SetGasPayment([]transaction.SuiObjectRef{*gasCoin}).
|
||||||
|
SetGasOwner(models.SuiAddress(signer.Address))
|
||||||
|
|
||||||
|
addressBytes, err := transaction.ConvertSuiAddressStringToBytes("0x0000000000000000000000000000000000000000000000000000000000000002")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
tx.MoveCall(
|
||||||
|
"0xeffc8ae61f439bb34c9b905ff8f29ec56873dcedf81c7123ff2f1f67c45ec302",
|
||||||
|
"utils",
|
||||||
|
"check_coin_threshold",
|
||||||
|
[]transaction.TypeTag{
|
||||||
|
{
|
||||||
|
Struct: &transaction.StructTag{
|
||||||
|
Address: *addressBytes,
|
||||||
|
Module: "sui",
|
||||||
|
Name: "SUI",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[]transaction.Argument{
|
||||||
|
tx.Gas(),
|
||||||
|
tx.Pure(uint64(1000000000 * 0.01)),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
resp, err := tx.Execute(
|
||||||
|
ctx,
|
||||||
|
models.SuiTransactionBlockOptions{
|
||||||
|
ShowInput: true,
|
||||||
|
ShowRawInput: true,
|
||||||
|
ShowEffects: true,
|
||||||
|
ShowEvents: true,
|
||||||
|
},
|
||||||
|
"WaitForLocalExecution",
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(resp.Digest, resp.Effects, resp.Results)
|
||||||
|
}
|
||||||
|
|
||||||
func sponsoredTransaction(ctx context.Context, suiClient *sui.Client, rawSigner *signer.Signer) {
|
func sponsoredTransaction(ctx context.Context, suiClient *sui.Client, rawSigner *signer.Signer) {
|
||||||
sponsoredSigner, err := signer.NewSignertWithMnemonic("")
|
sponsoredSigner, err := signer.NewSignertWithMnemonic("")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -1,45 +1,43 @@
|
|||||||
package transaction
|
package transaction
|
||||||
|
|
||||||
import "github.com/samber/lo"
|
|
||||||
|
|
||||||
func moveCall(input ProgrammableMoveCall) Command {
|
func moveCall(input ProgrammableMoveCall) Command {
|
||||||
return Command{
|
return Command{
|
||||||
MoveCall: lo.ToPtr(input),
|
MoveCall: &input,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func transferObjects(input TransferObjects) Command {
|
func transferObjects(input TransferObjects) Command {
|
||||||
return Command{
|
return Command{
|
||||||
TransferObjects: lo.ToPtr(input),
|
TransferObjects: &input,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func splitCoins(input SplitCoins) Command {
|
func splitCoins(input SplitCoins) Command {
|
||||||
return Command{
|
return Command{
|
||||||
SplitCoins: lo.ToPtr(input),
|
SplitCoins: &input,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeCoins(input MergeCoins) Command {
|
func mergeCoins(input MergeCoins) Command {
|
||||||
return Command{
|
return Command{
|
||||||
MergeCoins: lo.ToPtr(input),
|
MergeCoins: &input,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func publish(input Publish) Command {
|
func publish(input Publish) Command {
|
||||||
return Command{
|
return Command{
|
||||||
Publish: lo.ToPtr(input),
|
Publish: &input,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeMoveVec(input MakeMoveVec) Command {
|
func makeMoveVec(input MakeMoveVec) Command {
|
||||||
return Command{
|
return Command{
|
||||||
MakeMoveVec: lo.ToPtr(input),
|
MakeMoveVec: &input,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func upgrade(input Upgrade) Command {
|
func upgrade(input Upgrade) Command {
|
||||||
return Command{
|
return Command{
|
||||||
Upgrade: lo.ToPtr(input),
|
Upgrade: &input,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ func (tx *Transaction) MoveCall(
|
|||||||
packageId models.SuiAddress,
|
packageId models.SuiAddress,
|
||||||
module string,
|
module string,
|
||||||
function string,
|
function string,
|
||||||
typeArguments []string,
|
typeArguments []TypeTag,
|
||||||
arguments []Argument,
|
arguments []Argument,
|
||||||
) Argument {
|
) Argument {
|
||||||
packageIdBytes, err := ConvertSuiAddressStringToBytes(packageId)
|
packageIdBytes, err := ConvertSuiAddressStringToBytes(packageId)
|
||||||
@@ -219,7 +219,7 @@ func (tx *Transaction) MoveCall(
|
|||||||
Package: *packageIdBytes,
|
Package: *packageIdBytes,
|
||||||
Module: module,
|
Module: module,
|
||||||
Function: function,
|
Function: function,
|
||||||
TypeArguments: typeArguments,
|
TypeArguments: convertTypeTagsToTypeTagPtrs(typeArguments),
|
||||||
Arguments: convertArgumentsToArgumentPtrs(arguments),
|
Arguments: convertArgumentsToArgumentPtrs(arguments),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
@@ -471,10 +471,22 @@ func createTransactionResult(index uint16, length *uint16) Argument {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func convertArgumentsToArgumentPtrs(args []Argument) []*Argument {
|
func convertArgumentsToArgumentPtrs(args []Argument) []*Argument {
|
||||||
|
fmt.Println(len(args))
|
||||||
argPtrs := make([]*Argument, len(args))
|
argPtrs := make([]*Argument, len(args))
|
||||||
for i, arg := range args {
|
for i, arg := range args {
|
||||||
argPtrs[i] = &arg
|
v := arg
|
||||||
|
argPtrs[i] = &v
|
||||||
}
|
}
|
||||||
|
|
||||||
return argPtrs
|
return argPtrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func convertTypeTagsToTypeTagPtrs(tags []TypeTag) []*TypeTag {
|
||||||
|
tagPtrs := make([]*TypeTag, len(tags))
|
||||||
|
for i, tag := range tags {
|
||||||
|
v := tag
|
||||||
|
tagPtrs[i] = &v
|
||||||
|
}
|
||||||
|
|
||||||
|
return tagPtrs
|
||||||
|
}
|
||||||
|
|||||||
@@ -120,9 +120,9 @@ type ProgrammableTransaction struct {
|
|||||||
// - ConsensusCommitPrologue
|
// - ConsensusCommitPrologue
|
||||||
type TransactionKind struct {
|
type TransactionKind struct {
|
||||||
ProgrammableTransaction *ProgrammableTransaction
|
ProgrammableTransaction *ProgrammableTransaction
|
||||||
ChangeEpoch struct{}
|
ChangeEpoch any
|
||||||
Genesis struct{}
|
Genesis any
|
||||||
ConsensusCommitPrologue struct{}
|
ConsensusCommitPrologue any
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*TransactionKind) IsBcsEnum() {}
|
func (*TransactionKind) IsBcsEnum() {}
|
||||||
@@ -204,7 +204,7 @@ type ProgrammableMoveCall struct {
|
|||||||
Package models.SuiAddressBytes
|
Package models.SuiAddressBytes
|
||||||
Module string
|
Module string
|
||||||
Function string
|
Function string
|
||||||
TypeArguments []string
|
TypeArguments []*TypeTag
|
||||||
Arguments []*Argument
|
Arguments []*Argument
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,3 +270,28 @@ type SharedObjectRef struct {
|
|||||||
InitialSharedVersion uint64
|
InitialSharedVersion uint64
|
||||||
Mutable bool
|
Mutable bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type StructTag struct {
|
||||||
|
Address models.SuiAddressBytes
|
||||||
|
Module string
|
||||||
|
Name string
|
||||||
|
TypeParams []*TypeTag
|
||||||
|
}
|
||||||
|
|
||||||
|
// TypeTag https://github.com/MystenLabs/sui/blob/ece197ed5c414eb274f99afc52704664af8d0c38/external-crates/move/crates/move-core-types/src/language_storage.rs#L33
|
||||||
|
// Do not reorder the fields, it will break the bcs encoding
|
||||||
|
type TypeTag struct {
|
||||||
|
Bool *bool
|
||||||
|
U8 *bool
|
||||||
|
U128 *bool
|
||||||
|
U256 *bool
|
||||||
|
Address *bool
|
||||||
|
Signer *bool
|
||||||
|
Vector *TypeTag
|
||||||
|
Struct *StructTag
|
||||||
|
U16 *bool
|
||||||
|
U32 *bool
|
||||||
|
U64 *bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*TypeTag) IsBcsEnum() {}
|
||||||
|
|||||||
@@ -59,6 +59,39 @@ func TestNewTransaction(t *testing.T) {
|
|||||||
onlyTransactionKind: false,
|
onlyTransactionKind: false,
|
||||||
expectBcsBase64: "AAACAAgA4fUFAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkCAgABAQAAAQECAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgFhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYgIAAAAAAAAAIAABAgMEBQYHCAkAAQIDBAUGBwgJAAECAwQFBgcICQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYFAAAAAAAAAGQAAAAAAAAAAA==",
|
expectBcsBase64: "AAACAAgA4fUFAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkCAgABAQAAAQECAAABAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgFhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYgIAAAAAAAAAIAABAgMEBQYHCAkAAQIDBAUGBwgJAAECAwQFBgcICQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYFAAAAAAAAAGQAAAAAAAAAAA==",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "tx move call",
|
||||||
|
fun: func() *Transaction {
|
||||||
|
tx := setupTransaction()
|
||||||
|
|
||||||
|
addressBytes, err := ConvertSuiAddressStringToBytes("0x0000000000000000000000000000000000000000000000000000000000000002")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
tx.MoveCall(
|
||||||
|
"0xeffc8ae61f439bb34c9b905ff8f29ec56873dcedf81c7123ff2f1f67c45ec302",
|
||||||
|
"utils",
|
||||||
|
"check_coin_threshold",
|
||||||
|
[]TypeTag{
|
||||||
|
{
|
||||||
|
Struct: &StructTag{
|
||||||
|
Address: *addressBytes,
|
||||||
|
Module: "sui",
|
||||||
|
Name: "SUI",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[]Argument{
|
||||||
|
tx.Gas(),
|
||||||
|
tx.Pure(uint64(1000000000 * 0.1)),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
return tx
|
||||||
|
},
|
||||||
|
onlyTransactionKind: false,
|
||||||
|
expectBcsBase64: "AAABAAgA4fUFAAAAAAEA7/yK5h9Dm7NMm5Bf+PKexWhz3O34HHEj/y8fZ8RewwIFdXRpbHMUY2hlY2tfY29pbl90aHJlc2hvbGQBBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA3N1aQNTVUkAAgABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgFhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYmNhYgIAAAAAAAAAIAABAgMEBQYHCAkAAQIDBAUGBwgJAAECAwQFBgcICQECAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYFAAAAAAAAAGQAAAAAAAAAAA==",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, c := range cases {
|
for _, c := range cases {
|
||||||
|
|||||||
Reference in New Issue
Block a user