SUi calldata 其中一个分支
user_0057973
java
a year ago
12 kB
10
Indexable
private String buildSuiSwap(BigInteger amountIn, BigInteger minReturnAmount, DexQuoteInfoVO dexQuote, boolean isNativeFrom,
List<ExWalletInnerSignInfoInputCoins> inputCoins, List<ExWalletInnerSignInfoInputCoins> nativeCoins,
String gasPrice, String budget, String orderId, Integer toAmountDecimal, String fromTokenAddress,
String toTokenAddress, String userWalletAddress, PlatFormForMutilSwap platFormForMutilSwap) throws SerializationError {
// True 正向 False 反向
boolean tag = dexQuote.getExchangeDirection().equals(MultiSwapExchangeDirectionEnum.POSITIVE_DIRECTION.getDirection().toString());
String[] toTokenSplit = toTokenAddress.split("::");
String[] fromTokenSplit = fromTokenAddress.split("::");
if (fromTokenSplit.length < NUMBER_THREE || toTokenSplit.length < NUMBER_THREE) {
return null;
}
/**
* inputs
*/
List<CallArg> inputs = new ArrayList<>();
//native 是 splitCoins amount
if (isNativeFrom) {
CallArg.Pure.Builder pureBuilderFromAmount = new CallArg.Pure.Builder();
pureBuilderFromAmount.value = Arrays.asList(ArrayUtils.toObject(new MoveValue.U64(amountIn.longValue()).bcsSerialize()));
inputs.add(pureBuilderFromAmount.build());
} else {
for (ExWalletInnerSignInfoInputCoins inputCoin : inputCoins) {
SuiObjectRef suiObjectRef = new SuiObjectRef();
suiObjectRef.setObjectId(inputCoin.getObjectId());
suiObjectRef.setDigest(inputCoin.getDigest());
suiObjectRef.setVersion(new BigInteger(inputCoin.getVersion()));
Tuple3<ObjectID, SequenceNumber, ObjectDigest> objectRef = SuiProgrammableTransaction.getObjectRef(suiObjectRef);
ObjectArg.ImmOrOwnedObject immOrOwnedObject = new ObjectArg.ImmOrOwnedObject(objectRef);
CallArg.Object input = new CallArg.Object(immOrOwnedObject);
inputs.add(input);
}
}
//input 池子
AccountAddress.Builder poolObjectBuilder = new AccountAddress.Builder();
//池子地址
poolObjectBuilder.value = SuiProgrammableTransaction.geAddressBytes(dexQuote.getPairAddress());
ObjectArg.SharedObject object = new ObjectArg.SharedObject(new ObjectID(poolObjectBuilder.build()), new SequenceNumber(Long.valueOf(dexQuote.getPoolId())), true);
CallArg.Object pool = new CallArg.Object(object);
//input 参数3
CallArg.Pure.Builder pureBuilder3 = new CallArg.Pure.Builder();
pureBuilder3.value = Arrays.asList(ArrayUtils.toObject(new MoveValue.U64(amountIn.longValue()).bcsSerialize()));
//input 参数4
CallArg.Pure.Builder pureBuilder4 = new CallArg.Pure.Builder();
pureBuilder4.value = Arrays.asList(ArrayUtils.toObject(new MoveValue.U64(minReturnAmount.longValue()).bcsSerialize()));
//input 新版本新增一个clock参数
AccountAddress.Builder clockObjectBuilder = new AccountAddress.Builder();
//池子地址
clockObjectBuilder.value = SuiProgrammableTransaction.geAddressBytes(CLOCK_OBJECT);
ObjectArg.SharedObject clockObject = new ObjectArg.SharedObject(new ObjectID(clockObjectBuilder.build()), new SequenceNumber(1L), false);
CallArg.Object clock = new CallArg.Object(clockObject);
//input 参数5
CallArg.Pure.Builder pureBuilder5 = new CallArg.Pure.Builder();
pureBuilder5.value = Arrays.asList(ArrayUtils.toObject(new MoveValue.U64(Long.valueOf(orderId)).bcsSerialize()));
//input 参数6
CallArg.Pure.Builder pureBuilder6 = new CallArg.Pure.Builder();
pureBuilder6.value = Arrays.asList(ArrayUtils.toObject(new MoveValue.U8(toAmountDecimal.byteValue()).bcsSerialize()));
inputs.add(pool);
inputs.add(pureBuilder3.build());
inputs.add(pureBuilder4.build());
inputs.add(clock);
inputs.add(pureBuilder5.build());
inputs.add(pureBuilder6.build());
/**
* gas
*/
final GasData.Builder gasDataBuilder = new GasData.Builder();
//主网币的coin放在gaspaymen里了
gasDataBuilder.budget = Long.valueOf(budget);
gasDataBuilder.price = Long.valueOf(gasPrice);
List<Tuple3<ObjectID, SequenceNumber, ObjectDigest>> gasPayment = new ArrayList<>();
// inputCoins就为主网币
for (ExWalletInnerSignInfoInputCoins nativeCoin : nativeCoins) {
SuiObjectRef suiObjectRef = new SuiObjectRef();
suiObjectRef.setObjectId(nativeCoin.getObjectId());
suiObjectRef.setDigest(nativeCoin.getDigest());
suiObjectRef.setVersion(new BigInteger(nativeCoin.getVersion()));
gasPayment.add(SuiProgrammableTransaction.getObjectRef(suiObjectRef));
}
gasDataBuilder.payment = gasPayment;
SuiAddress.Builder senderAddress = new SuiAddress.Builder();
senderAddress.value = geAddressBytes(userWalletAddress);
gasDataBuilder.owner = senderAddress.build();
/**
* transactions
*/
//from是native token需要SplitCoins
List<Command> commands = new ArrayList<>();
if (isNativeFrom) {
Command.SplitCoins.Builder splitCoinCommandBuilder = new Command.SplitCoins.Builder();
//transaction1 SplitCoins
Argument amountArg = SuiProgrammableTransaction.pure(Long.valueOf(amountIn.toString()), 0);
splitCoinCommandBuilder.field0 = new Argument.GasCoin.Builder().build();
splitCoinCommandBuilder.field1 = Lists.newArrayList(amountArg);
commands.add(splitCoinCommandBuilder.build());
//transaction2 MakeMoveVec
List<Argument> arguments = new ArrayList<>();
Argument.Result.Builder resultBuilder = new Argument.Result.Builder();
resultBuilder.value = 0;
arguments.add(resultBuilder.build());
Command.MakeMoveVec.Builder makeMoveVecBuilder = new Command.MakeMoveVec.Builder();
makeMoveVecBuilder.field0 = Optional.empty();
makeMoveVecBuilder.field1 = arguments;
commands.add(makeMoveVecBuilder.build());
} else {
//transaction1 MakeMoveVec
List<Argument> arguments = new ArrayList<>();
for (short i = 0; i < inputCoins.size(); i++) {
Argument.Input.Builder input = new Argument.Input.Builder();
input.value = i;
arguments.add(input.build());
}
Command.MakeMoveVec.Builder makeMoveVecBuilder = new Command.MakeMoveVec.Builder();
makeMoveVecBuilder.field0 = Optional.empty();
makeMoveVecBuilder.field1 = arguments;
commands.add(makeMoveVecBuilder.build());
}
//transaction3 MoveCall
Command.MoveCall.Builder moveCallBuilder = new Command.MoveCall.Builder();
ProgrammableMoveCall.Builder progCallBuilder = new ProgrammableMoveCall.Builder();
AccountAddress.Builder objectPackageBuilder = new AccountAddress.Builder();
//todo 需要替换成合约的正式package和router
objectPackageBuilder.value = geAddressBytes(platFormForMutilSwap.getDexRouterAddress());
progCallBuilder.Package = new ObjectID(objectPackageBuilder.build());
progCallBuilder.module = new Identifier(SWAP_ROUTER);
List<TypeTag> typeTags = new ArrayList<>();
//token0
TypeTag.struct.Builder struct0 = new TypeTag.struct.Builder();
StructTag.Builder structTag0 = new StructTag.Builder();
AccountAddress.Builder structAddress0 = new AccountAddress.Builder();
structAddress0.value = geAddressBytes(fromTokenSplit[ZERO]);
structTag0.address = structAddress0.build();
structTag0.module = new Identifier(fromTokenSplit[ONE]);
structTag0.name = new Identifier(fromTokenSplit[TWO]);
structTag0.type_args = new ArrayList<>();
struct0.value = structTag0.build();
//token1
TypeTag.struct.Builder struct1 = new TypeTag.struct.Builder();
StructTag.Builder structTag1 = new StructTag.Builder();
AccountAddress.Builder structAddress1 = new AccountAddress.Builder();
structAddress1.value = geAddressBytes(toTokenSplit[ZERO]);
structTag1.address = structAddress1.build();
structTag1.module = new Identifier(toTokenSplit[ONE]);
structTag1.name = new Identifier(toTokenSplit[TWO]);
structTag1.type_args = new ArrayList<>();
struct1.value = structTag1.build();
if (tag) {
progCallBuilder.function = new Identifier("suiswap_x_2_y");
typeTags.add(struct0.build());
typeTags.add(struct1.build());
} else {
progCallBuilder.function = new Identifier("suiswap_y_2_x");
typeTags.add(struct1.build());
typeTags.add(struct0.build());
}
progCallBuilder.type_arguments = typeTags;
int startIndex = isNativeFrom ? 1 : inputCoins.size();
List<Argument> txArg = new ArrayList<>();
Argument.Input.Builder inputBuilder0 = new Argument.Input.Builder();
inputBuilder0.value = (short) startIndex;
Argument.Result.Builder resultBuilder = new Argument.Result.Builder();
resultBuilder.value = (short) (isNativeFrom ? 1 : 0);
Argument.Input.Builder inputBuilder2 = new Argument.Input.Builder();
inputBuilder2.value = (short) (startIndex + 1);
Argument.Input.Builder inputBuilder3 = new Argument.Input.Builder();
inputBuilder3.value = (short) (startIndex + 2);
Argument.Input.Builder inputBuilder4 = new Argument.Input.Builder();
inputBuilder4.value = (short) (startIndex + 3);
Argument.Input.Builder inputBuilder5 = new Argument.Input.Builder();
inputBuilder5.value = (short) (startIndex + 4);
Argument.Input.Builder inputBuilder6 = new Argument.Input.Builder();
inputBuilder6.value = (short) (startIndex + 5);
txArg.add(inputBuilder0.build());
txArg.add(resultBuilder.build());
txArg.add(inputBuilder2.build());
txArg.add(inputBuilder3.build());
txArg.add(inputBuilder4.build());
txArg.add(inputBuilder5.build());
txArg.add(inputBuilder6.build());
progCallBuilder.arguments = txArg;
moveCallBuilder.value = progCallBuilder.build();
commands.add(moveCallBuilder.build());
ProgrammableTransaction programmableTransaction = new ProgrammableTransaction(inputs, commands);
final TransactionDataV1.Builder transactionDataV1Builder = new TransactionDataV1.Builder();
TransactionKind.ProgrammableTransaction.Builder builder = new TransactionKind.ProgrammableTransaction.Builder();
builder.value = programmableTransaction;
transactionDataV1Builder.kind = builder.build();
transactionDataV1Builder.sender = senderAddress.build();
transactionDataV1Builder.gas_data = gasDataBuilder.build();
TransactionExpiration.None.Builder expirationBuilder = new TransactionExpiration.None.Builder();
transactionDataV1Builder.expiration = expirationBuilder.build();
final TransactionData.V1.Builder v1Builder = new TransactionData.V1.Builder();
v1Builder.value = transactionDataV1Builder.build();
byte[] tx = v1Builder.build().bcsSerialize();
return Base64.toBase64String(tx);
}Editor is loading...
Leave a Comment