package org.ripple.power.txns; import org.json.JSONObject; import org.ripple.power.RippleObject; import org.ripple.power.RippleSeedAddress; import org.ripple.power.RippleSchemas.BinaryFormatField; import org.ripple.power.RippleSchemas.TransactionTypes; import org.ripple.power.config.LSystem; import org.ripple.power.utils.StringUtils; import com.ripple.core.enums.TransactionFlag; public class OfferCreate { public static void sell(final RippleSeedAddress seed, final String pair, final String issuer, final double price, final double amount, final String fee, final Rollback back) { set(seed, matchOfferSell(pair, issuer, price, amount), fee, back); } public static void buy(final RippleSeedAddress seed, final String pair, final String issuer, final double price, final double amount, final String fee, final Rollback back) { set(seed, matchOfferBuy(pair, issuer, price, amount), fee, back); } public static void set(final RippleSeedAddress seed, final BookOffer offer, final String fee, final Rollback back) { final String address = seed.getPublicRippleAddress().toString(); AccountFind find = new AccountFind(); find.info(address, new Rollback() { @Override public void success(JSONObject message) { try { long sequence = TransactionUtils.getSequence(message); RippleObject item = new RippleObject(); item.putField(BinaryFormatField.TransactionType, (int) TransactionTypes.OFFER_CREATE.byteValue); item.putField(BinaryFormatField.Account, seed.getPublicRippleAddress()); item.putField(BinaryFormatField.TakerPays, offer.buy); item.putField(BinaryFormatField.TakerGets, offer.sell); item.putField(BinaryFormatField.Fee, CurrencyUtils.getValueToRipple(fee)); item.putField(BinaryFormatField.Sequence, sequence); if (offer.sequence > 0) { item.putField(BinaryFormatField.OfferSequence, offer.sequence); } if (offer.flags > 0) { item.putField(BinaryFormatField.Flags, offer.flags); } TransactionUtils.submitBlob(seed, item, back); } catch (Exception e) { e.printStackTrace(); } } @Override public void error(JSONObject message) { if (back != null) { back.error(message); } } }); } public static BookOffer matchOfferSell(String pair, String issuer, double price, double amount, long seq) { return matchOfferSell(pair, issuer, price, amount, seq, TransactionFlag.Sell); } public static BookOffer matchOfferSell(String pair, String issuer, double price, double amount) { return matchOfferSell(pair, issuer, price, amount, 0, TransactionFlag.Sell); } /** * matchOfferBuy("XRP,BTC","rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",2,1) * * @param pair * @param issuer * @param price * @param amount * @param seq * @param flags * @return */ public static BookOffer matchOfferSell(String pair, String issuer, double price, double amount, long seq, long flags) { if (issuer.startsWith("~")) { try { issuer = NameFind.getAddress(issuer); } catch (Exception e) { return null; } } String[] split = StringUtils.split(StringUtils.rtrim(pair) .toUpperCase(), ","); BookOffer offer = new BookOffer( matchOffer(split[1], LSystem.getNumberShort(String.valueOf(amount * price)), issuer), matchOffer(split[0], LSystem.getNumberShort(String.valueOf(amount)), issuer), seq, flags); return offer; } public static BookOffer matchOfferBuy(String pair, String issuer, double price, double amount, long seq) { return matchOfferBuy(pair, issuer, price, amount, seq, 0); } public static BookOffer matchOfferBuy(String pair, String issuer, double price, double amount) { return matchOfferBuy(pair, issuer, price, amount, 0, 0); } /** * matchOfferBuy("XRP,BTC","rvYAfWj5gh67oV6fW32ZzP3Aw4Eubs59B",3,1) * * @param pair * @param issuer * @param price * @param amount * @param seq * @param flags * @return */ public static BookOffer matchOfferBuy(String pair, String issuer, double price, double amount, long seq, long flags) { if (issuer.startsWith("~")) { try { issuer = NameFind.getAddress(issuer); } catch (Exception e) { return null; } } String[] split = StringUtils.split(StringUtils.rtrim(pair) .toUpperCase(), ","); BookOffer offer = new BookOffer(matchOffer(split[0], LSystem.getNumberShort(String.valueOf(amount)), issuer), matchOffer(split[1], LSystem.getNumberShort(String.valueOf(amount * price)), issuer), seq, flags); return offer; } public static IssuedCurrency matchOffer(String name, String value, String issuer) { return (LSystem.nativeCurrency.equalsIgnoreCase(name)) ? new IssuedCurrency( CurrencyUtils.getValueToRipple(value)) : new IssuedCurrency( value, issuer, name); } public static void set(final RippleSeedAddress seed, final IssuedCurrency src, final IssuedCurrency dst, final String fee, final Rollback back) { OfferCreate.set(seed, src, dst, fee, -1, 1.0001f, back); } public static void set(final RippleSeedAddress seed, final IssuedCurrency src, final IssuedCurrency dst, final String fee, float scale, final Rollback back) { OfferCreate.set(seed, src, dst, fee, -1, scale, back); } public static void set(final RippleSeedAddress seed, final IssuedCurrency src, final IssuedCurrency dst, final String fee, final long offerSequence, final float scale, final Rollback back) { OfferCreate.set(seed, src, dst, fee, offerSequence, scale, 0, back); } public static void set(final RippleSeedAddress seed, final IssuedCurrency src, final IssuedCurrency dst, final String fee, final long offerSequence, final float scale, final long flags, final Rollback back) { final String address = seed.getPublicRippleAddress().toString(); AccountFind find = new AccountFind(); find.info(address, new Rollback() { @Override public void success(JSONObject message) { try { long sequence = TransactionUtils.getSequence(message); RippleObject item = new RippleObject(); item.putField(BinaryFormatField.TransactionType, (int) TransactionTypes.OFFER_CREATE.byteValue); item.putField(BinaryFormatField.Account, seed.getPublicRippleAddress()); if (scale > 0) { dst.scale(scale); } if (flags != 0) { item.putField(BinaryFormatField.Flags, flags); } item.putField(BinaryFormatField.TakerPays, src); item.putField(BinaryFormatField.TakerGets, dst); item.putField(BinaryFormatField.Fee, CurrencyUtils.getValueToRipple(fee)); item.putField(BinaryFormatField.Sequence, sequence); if (offerSequence > -1) { item.putField(BinaryFormatField.OfferSequence, offerSequence); } TransactionUtils.submitBlob(seed, item, back); } catch (Exception e) { e.printStackTrace(); } } @Override public void error(JSONObject message) { if (back != null) { back.error(message); } } }); } }