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 (
"bytes"
"context"
"math"
"github.com/block-vision/sui-go-sdk/models"
"github.com/block-vision/sui-go-sdk/mystenbcs"
"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/samber/lo"
)
type Transaction struct {
Data TransactionData
Signer *signer.Signer
Data TransactionData
Signer *signer.Signer
SuiClient *sui.Client
}
func NewTransaction() *Transaction {
@@ -21,9 +24,6 @@ func NewTransaction() *Transaction {
data.V1.Kind = &TransactionKind{
ProgrammableTransaction: &ProgrammableTransaction{},
}
data.V1.Expiration = &TransactionExpiration{
None: lo.ToPtr(true),
}
return &Transaction{
Data: data,
@@ -36,13 +36,19 @@ func (tx *Transaction) SetSigner(signer *signer.Signer) *Transaction {
return tx
}
func (tx *Transaction) SetSuiClient(client *sui.Client) *Transaction {
tx.SuiClient = client
return tx
}
func (tx *Transaction) SetSender(sender models.SuiAddress) *Transaction {
address := utils.NormalizeSuiAddress(string(sender))
addressBytes, err := ConvertSuiAddressStringToBytes(address)
if err != nil {
panic(err)
}
tx.Data.V1.Sender = *addressBytes
tx.Data.V1.Sender = addressBytes
return tx
}
@@ -311,6 +317,7 @@ func (tx *Transaction) Pure(input any) *Argument {
}
func (tx *Transaction) ToSuiExecuteTransactionBlockRequest(
ctx context.Context,
options models.SuiTransactionBlockOptions,
requestType string,
) (*models.SuiExecuteTransactionBlockRequest, error) {
@@ -318,7 +325,7 @@ func (tx *Transaction) ToSuiExecuteTransactionBlockRequest(
return nil, ErrSignerNotSet
}
txBytes, err := tx.buildTransaction()
txBytes, err := tx.buildTransaction(ctx)
if err != nil {
return nil, err
}
@@ -336,11 +343,20 @@ func (tx *Transaction) ToSuiExecuteTransactionBlockRequest(
}, nil
}
func (tx *Transaction) buildTransaction() (string, error) {
func (tx *Transaction) buildTransaction(ctx context.Context) (string, error) {
if tx.Signer == nil {
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.SetSenderIfNotSet(models.SuiAddress(tx.Signer.Address))
@@ -360,7 +376,6 @@ func (tx *Transaction) build(onlyTransactionKind bool) (string, error) {
if tx.Data.V1.Sender.IsZero() {
return "", ErrSenderNotSet
}
// TODO: Support get latest gas data online
if !tx.Data.V1.GasData.IsFullySet() {
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
type TransactionDataV1 struct {
Kind *TransactionKind
Sender models.SuiAddressBytes
Sender *models.SuiAddressBytes `bcs:"optional"`
GasData GasData
Expiration *TransactionExpiration
Expiration *TransactionExpiration `bcs:"optional"`
}
func (td *TransactionDataV1) AddCommand(command Command) (index uint16) {
@@ -102,8 +102,7 @@ func (gd *GasData) IsFullySet() bool {
// - None
// - Epoch
type TransactionExpiration struct {
None *bool
Epoch *uint64
mystenbcs.Option[uint64]
}
func (*TransactionExpiration) IsBcsEnum() {}

View File

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