2020/05/27

StellarのカスタムAssetをnodejsを使って送金する

crypto-assetstellarjavascript

概要

携わっているプロジェクトでは、StellarをベースとしたAssetを発行・運用しています。
以下の公式サイトが詳しいです。

Assets | Stellar Developers

今回、livenetでAssetの送金が必要になったため、送金用のスクリプトを作成して、実行しました。

実施事項

以下のスクリプトを作成し、実行しました。
ポイントとしては以下です。

  • スクリプトの冒頭で、必要なアカウントIDやシークレットを定義しておきます
  • testの変数の値で、testnetかlivenetをswitchすることができます
  • nodeのコンソールを立ち上げて、スクリプトをコピペして実行しました
  • マルチシグを採用している場合は、必要な数だけ transaction.sign を実行する必要がありますが、今回はマルチシグではないので、Ownerアカウントのキーだけで送金しました
(function() {
  var fromAccountSecret = 'SXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
  var assetCode = 'SNC'
  var issuerAccountID = 'GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
  var destinationAccountID = 'GXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
  var sendAmount = '10';
  var test = true;
  (function(baseAccountSecret, assetCode, issuerAccountID, destinationAccountID, sendAmount, test) {
    var StellarSdk = require('stellar-sdk');
    var server;
    var homeDomain;
    if (test) {
      StellarSdk.Network.useTestNetwork();
      server = new StellarSdk.Server('https://horizon-testnet.stellar.org');
      homeDomain = 'testnet.sencoin.com';
    } else {
      StellarSdk.Network.usePublicNetwork();
      server = new StellarSdk.Server('https://horizon.stellar.org');
      homeDomain = 'www.sencoin.com';
    }
    var fromAccountKeypair = StellarSdk.Keypair.fromSecret(fromAccountSecret);
    var asset = new StellarSdk.Asset(assetCode, issuerAccountID);

    server.loadAccount(fromAccountKeypair.publicKey())
      .then(function(fromAccount) {
        var transaction = new StellarSdk.TransactionBuilder(fromAccount).addOperation(StellarSdk.Operation.payment({
          destination: destinationAccountID,
          asset: asset,
          amount: sendAmount
        })).build();
        transaction.sign(fromAccountKeypair);
        console.log('send payment of ' + assetCode + ' transaction');
        return server.submitTransaction(transaction);
      })
      .then(function() {
        console.log('let\'s load target account');
        return server.loadAccount(destinationAccountID)
      })
      .then(function(destinationAccount) {
        console.log(destinationAccount);
      })
      .catch(function(error) {
        console.log('Error occurred: ', error)
      });
  })(fromAccountSecret, assetCode, issuerAccountID, destinationAccountID, sendAmount, test);
})();

以上になります。