Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Referencing Coins in ProgrammableTransactionBuilder, type Result #44

Open
thousandsofthem opened this issue Feb 11, 2025 · 0 comments
Open

Comments

@thousandsofthem
Copy link

thousandsofthem commented Feb 11, 2025

Question: how to reference coins as sui_types.Argument when building ProgrammableMoveCall arguments?

Trying to swap coins on Cetus exchange. Reference can be used like this:

argCoin0, _ := ptb.Obj(sui_types.ObjectArg{
    ImmOrOwnedObject: coinTypeAdata.Reference(),
})

Just using reference directly produces error like this:

Error checking transaction input objects: MutableObjectUsedMoreThanOnce { object_id: 0xbaa475d27182a12a12d18650aab887575afba27f271c434e1614ed0eeabf283c } (this is address of SUI coin object).

Real transactions replace coin references with Result N, can not produce result like this via this SDK.
Image

Usage example:

packageId, _ := sui_types.NewObjectIdFromHex("0x3a5aa90ffa33d09100d7b6941ea1c0ffe6ab66e77062ddd26320c1b073aabb10")

ptb := sui_types.NewProgrammableTransactionBuilder()
argA2b, _ := ptb.Pure(true)
argByAmountIn, _ := ptb.Pure(true)
argAmount, _ := ptb.Pure(100000)
argSqrtPriceLimit, _ := ptb.Pure(bcs.NewUint128FromUint64(4295048016, 0))
argFalse, _ := ptb.Pure(false)

argGlobalConfigId, _ := ptb.Obj(sui_types.ObjectArg{
	SharedObject: &struct {
		Id                   sui_types.ObjectID
		InitialSharedVersion sui_types.SequenceNumber
		Mutable              bool
	}{
		Id:                   *globalConfigIdObj,
		InitialSharedVersion: 1574190,
		Mutable:              true,
	},
})
argPoolAddr, _ := ptb.Obj(sui_types.ObjectArg{
	SharedObject: &struct {
		Id                   sui_types.ObjectID
		InitialSharedVersion sui_types.SequenceNumber
		Mutable              bool
	}{
		Id: *poolObj,
		InitialSharedVersion: *poolInShVer,
		Mutable:              true,
	},
})




ptb.Command(
	sui_types.Command{
		MoveCall: &sui_types.ProgrammableMoveCall{
			Package:       *packageId,
			Module:        move_types.Identifier("router"),
			Function:      move_types.Identifier("swap"),
			TypeArguments: []move_types.TypeTag{
				{Struct: &move_types.StructTag{Address: *coin1Addr, Module: "usdc", Name: "USDC"}},
				{Struct: &move_types.StructTag{Address: *coin2Addr, Module: "sui", Name: "SUI"}},
			},
			Arguments: []sui_types.Argument{					
				argGlobalConfigId,
				argPoolAddr,
				argCoin0, // <-- this
				argCoin1, // <-- this
				argA2b,
				argByAmountIn,
				argAmount,
				argSqrtPriceLimit,
				argFalse,
				argClockAddress,

			},
		},
	},
)
pt := ptb.Finish()

tx := sui_types.NewProgrammable(
	*wallet, []*sui_types.ObjectRef{coinTypeBdata.Reference()},
	pt, 1000000, 1000,
)

txBytes, err := bcs.Marshal(tx)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant