diff --git a/core/src/main/java/org/bitcorej/chain/ChainStateProxy.java b/core/src/main/java/org/bitcorej/chain/ChainStateProxy.java index a02c21e..c50810f 100644 --- a/core/src/main/java/org/bitcorej/chain/ChainStateProxy.java +++ b/core/src/main/java/org/bitcorej/chain/ChainStateProxy.java @@ -2,6 +2,7 @@ import org.bitcorej.chain.ada.CardanoStateProvider; import org.bitcorej.chain.adk.ADKStateProvider; +import org.bitcorej.chain.akt.AKTStateProvider; import org.bitcorej.chain.ask.ASKStateProvider; import org.bitcorej.chain.bch.BCHStateProvider; import org.bitcorej.chain.bhd.BHDStateProvider; @@ -228,6 +229,9 @@ public class ChainStateProxy implements ChainState, UTXOState, USDTState, XMRSta WESTStateProvider west = new WESTStateProvider(); services.put("WEST", west); services.put("WEST_MAIN", west); + AKTStateProvider akt = new AKTStateProvider(); + services.put("AKT", akt); + services.put("AKT_MAIN", akt); } private ChainState provider; diff --git a/core/src/main/java/org/bitcorej/chain/akt/AKTStateProvider.java b/core/src/main/java/org/bitcorej/chain/akt/AKTStateProvider.java new file mode 100644 index 0000000..c33cda5 --- /dev/null +++ b/core/src/main/java/org/bitcorej/chain/akt/AKTStateProvider.java @@ -0,0 +1,59 @@ +package org.bitcorej.chain.akt; + +import org.apache.commons.codec.binary.Base64; +import org.bitcoinj.core.ECKey; +import org.bitcoinj.core.Sha256Hash; +import org.bitcorej.chain.cosmos.CosmosStateProvider; +import org.bitcorej.utils.ByteUtil; +import org.bitcorej.utils.NumericUtil; +import org.bouncycastle.util.encoders.Hex; +import org.json.JSONObject; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.List; + +public class AKTStateProvider extends CosmosStateProvider { + public AKTStateProvider() { + super.bech32AccAddr = "akash"; + super.transferPrefix = "cosmos-sdk/MsgSend"; + } + + @Override + public String signRawTransaction(String rawTx, List keys) { + JSONObject jsonObject = new JSONObject(rawTx); + int accountNumber = jsonObject.getInt("account_number"); + String chainId = jsonObject.getString("chain_id"); + String feeDenom = jsonObject.getJSONObject("fees").getString("denom"); + String feeAmount = jsonObject.getJSONObject("fees").getString("amount"); + String gas = jsonObject.getString("gas"); + String memo = jsonObject.getString("memo"); + int sequence = jsonObject.getInt("sequence"); + String from = jsonObject.getString("from"); + String to = jsonObject.getJSONObject("msg").getString("to"); + String toDenom = jsonObject.getJSONObject("msg").getJSONArray("coins").getJSONObject(0).getString("denom"); + String toAmount = jsonObject.getJSONObject("msg").getJSONArray("coins").getJSONObject(0).getString("amount"); + + String msg = "{\"account_number\":\"" + accountNumber + "\",\"chain_id\":\"" + chainId + "\",\"fee\":{\"amount\":[{\"amount\":\"" + feeAmount + "\",\"denom\":\"" + feeDenom + "\"}],\"gas\":\"" + gas + "\"},\"memo\":\"" + memo + "\",\"msgs\":[{\"type\":\"" + this.transferPrefix + "\",\"value\":{\"amount\":[{\"amount\":\"" + toAmount + "\",\"denom\":\"" + toDenom + "\"}],\"from_address\":\"" + from + "\",\"to_address\":\"" + to + "\"}}],\"sequence\":\"" + sequence + "\"}"; + MessageDigest digest = null; + try { + digest = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return null; + } + byte[] hash = digest.digest( + msg.getBytes(StandardCharsets.UTF_8)); + String sha256hex = new String(Hex.encode(hash)); + + ECKey ecKey = ECKey.fromPrivate(NumericUtil.hexToBytes(keys.get(0))); + ECKey.ECDSASignature sig = ecKey.sign(Sha256Hash.wrap(sha256hex)); + + byte[] signature = ByteUtil.concat(sig.r.toByteArray(), sig.s.toByteArray()); + + String sigBase64 = Base64.encodeBase64String(ByteUtil.trimLeadingZeroes(signature)); + String pub = Base64.encodeBase64String(ecKey.getPubKey()); + return "{\"tx\":{\"msg\":[{\"type\":\"" + this.transferPrefix + "\",\"value\":{\"amount\":[{\"amount\":\"" + toAmount +"\",\"denom\":\"" + toDenom + "\"}],\"from_address\":\"" + from + "\",\"to_address\":\"" + to + "\"}}],\"fee\":{\"amount\":[{\"denom\":\"" + feeDenom + "\",\"amount\":\"" + feeAmount + "\"}],\"gas\":\"" + gas + "\"},\"signatures\":[{\"pub_key\":{\"type\":\"tendermint/PubKeySecp256k1\",\"value\":\"" + pub + "\"},\"signature\":\"" + sigBase64 + "\"}],\"memo\":\"" + memo + "\"},\"mode\":\"async\"}"; + } +}