Add set default sui price with client

This commit is contained in:
Chenyang
2025-04-20 08:22:40 +08:00
parent 6673ef1f3b
commit 0e6433967c
3 changed files with 31 additions and 15 deletions

View File

@@ -2,18 +2,21 @@ package transaction
import ( import (
"bytes" "bytes"
"context"
"math" "math"
"github.com/block-vision/sui-go-sdk/models" "github.com/block-vision/sui-go-sdk/models"
"github.com/block-vision/sui-go-sdk/mystenbcs" "github.com/block-vision/sui-go-sdk/mystenbcs"
"github.com/block-vision/sui-go-sdk/signer" "github.com/block-vision/sui-go-sdk/signer"
"github.com/block-vision/sui-go-sdk/sui"
"github.com/block-vision/sui-go-sdk/utils" "github.com/block-vision/sui-go-sdk/utils"
"github.com/samber/lo" "github.com/samber/lo"
) )
type Transaction struct { type Transaction struct {
Data TransactionData Data TransactionData
Signer *signer.Signer Signer *signer.Signer
SuiClient *sui.Client
} }
func NewTransaction() *Transaction { func NewTransaction() *Transaction {
@@ -21,9 +24,6 @@ func NewTransaction() *Transaction {
data.V1.Kind = &TransactionKind{ data.V1.Kind = &TransactionKind{
ProgrammableTransaction: &ProgrammableTransaction{}, ProgrammableTransaction: &ProgrammableTransaction{},
} }
data.V1.Expiration = &TransactionExpiration{
None: lo.ToPtr(true),
}
return &Transaction{ return &Transaction{
Data: data, Data: data,
@@ -36,13 +36,19 @@ func (tx *Transaction) SetSigner(signer *signer.Signer) *Transaction {
return tx return tx
} }
func (tx *Transaction) SetSuiClient(client *sui.Client) *Transaction {
tx.SuiClient = client
return tx
}
func (tx *Transaction) SetSender(sender models.SuiAddress) *Transaction { func (tx *Transaction) SetSender(sender models.SuiAddress) *Transaction {
address := utils.NormalizeSuiAddress(string(sender)) address := utils.NormalizeSuiAddress(string(sender))
addressBytes, err := ConvertSuiAddressStringToBytes(address) addressBytes, err := ConvertSuiAddressStringToBytes(address)
if err != nil { if err != nil {
panic(err) panic(err)
} }
tx.Data.V1.Sender = *addressBytes tx.Data.V1.Sender = addressBytes
return tx return tx
} }
@@ -311,6 +317,7 @@ func (tx *Transaction) Pure(input any) *Argument {
} }
func (tx *Transaction) ToSuiExecuteTransactionBlockRequest( func (tx *Transaction) ToSuiExecuteTransactionBlockRequest(
ctx context.Context,
options models.SuiTransactionBlockOptions, options models.SuiTransactionBlockOptions,
requestType string, requestType string,
) (*models.SuiExecuteTransactionBlockRequest, error) { ) (*models.SuiExecuteTransactionBlockRequest, error) {
@@ -318,7 +325,7 @@ func (tx *Transaction) ToSuiExecuteTransactionBlockRequest(
return nil, ErrSignerNotSet return nil, ErrSignerNotSet
} }
txBytes, err := tx.buildTransaction() txBytes, err := tx.buildTransaction(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -336,11 +343,20 @@ func (tx *Transaction) ToSuiExecuteTransactionBlockRequest(
}, nil }, nil
} }
func (tx *Transaction) buildTransaction() (string, error) { func (tx *Transaction) buildTransaction(ctx context.Context) (string, error) {
if tx.Signer == nil { if tx.Signer == nil {
return "", ErrSignerNotSet return "", ErrSignerNotSet
} }
if tx.Data.V1.GasData.Price == nil {
if tx.SuiClient != nil {
rsp, err := tx.SuiClient.SuiXGetReferenceGasPrice(ctx)
if err != nil {
return "", err
}
tx.SetGasPrice(rsp)
}
}
tx.SetGasBudgetIfNotSet(defaultGasBudget) tx.SetGasBudgetIfNotSet(defaultGasBudget)
tx.SetSenderIfNotSet(models.SuiAddress(tx.Signer.Address)) tx.SetSenderIfNotSet(models.SuiAddress(tx.Signer.Address))
@@ -360,7 +376,6 @@ func (tx *Transaction) build(onlyTransactionKind bool) (string, error) {
if tx.Data.V1.Sender.IsZero() { if tx.Data.V1.Sender.IsZero() {
return "", ErrSenderNotSet return "", ErrSenderNotSet
} }
// TODO: Support get latest gas data online
if !tx.Data.V1.GasData.IsFullySet() { if !tx.Data.V1.GasData.IsFullySet() {
return "", ErrGasDataNotFullySet return "", ErrGasDataNotFullySet
} }

View File

@@ -25,9 +25,9 @@ func (td *TransactionData) Marshal() ([]byte, error) {
// TransactionDataV1 https://github.com/MystenLabs/sui/blob/fb27c6c7166f5e4279d5fd1b2ebc5580ca0e81b2/crates/sui-types/src/transaction.rs#L1625 // TransactionDataV1 https://github.com/MystenLabs/sui/blob/fb27c6c7166f5e4279d5fd1b2ebc5580ca0e81b2/crates/sui-types/src/transaction.rs#L1625
type TransactionDataV1 struct { type TransactionDataV1 struct {
Kind *TransactionKind Kind *TransactionKind
Sender models.SuiAddressBytes Sender *models.SuiAddressBytes `bcs:"optional"`
GasData GasData GasData GasData
Expiration *TransactionExpiration Expiration *TransactionExpiration `bcs:"optional"`
} }
func (td *TransactionDataV1) AddCommand(command Command) (index uint16) { func (td *TransactionDataV1) AddCommand(command Command) (index uint16) {
@@ -102,8 +102,7 @@ func (gd *GasData) IsFullySet() bool {
// - None // - None
// - Epoch // - Epoch
type TransactionExpiration struct { type TransactionExpiration struct {
None *bool mystenbcs.Option[uint64]
Epoch *uint64
} }
func (*TransactionExpiration) IsBcsEnum() {} func (*TransactionExpiration) IsBcsEnum() {}

View File

@@ -79,7 +79,9 @@ func generateObjectRef() SuiObjectRef {
func setupTransaction() *Transaction { func setupTransaction() *Transaction {
tx := NewTransaction() tx := NewTransaction()
tx.SetSender("0x2"). tx.SetSender("0x2").
SetGasPrice(5).SetGasBudget(100).SetGasOwner("0x6"). SetGasPrice(5).
SetGasPayment([]SuiObjectRef{generateObjectRef()}) SetGasBudget(100).
SetGasPayment([]SuiObjectRef{generateObjectRef()}).
SetGasOwner("0x6")
return tx return tx
} }