cryptact 2022 USDCの残高が足りないエラーに対応。

そもそもUSDCの取得履歴が無いのが問題である。

USDCはずっとbybitでステーキングしていたはずで、FTXのショックで引き出すことになった。

Cryptactの履歴で、USDCの取引を調べてみました。

最初の取引はBybitのステーキング報酬となっています。

ステーキング報酬という事はステーク、置いておくためのUSDCをその前に取得してはずで、その履歴が入っていない用でした。

また、Bybitのステーキングは、
2022-11-12 が最後。ここで止めて引き出しています。FTXの影響です。

ここまで毎日数百円の報酬となっていたようです。

で、最初は2022-01-01 となっています。Cryptact上は。
とはいえここはテストで置いといたステーキング報酬(2021年分についたやつ。)を纏めて入力している。金額自体は少額。

用は2021年からUSDCを保有しているはずです。
ここでまとめて入力していても置いといただけで換金していないので2021年の損益に影響はないはずです。

で、Bybitのステーキング履歴から状況を見てみます。

ここで若干の誤差レベルで、ステーキング金額=出金金額=今回の不足分のエラー額となっているようでした。

つまり、ステーキングのための取得以外でほぼプラスマイナスが無いと思われます。

で、

この辺のデータは以下のようにまとめて記録しておきました。

k会計データ\2022年\暗号資産\bybit\2022bybit不足分考察(USDC)

と、ここまで書いていて思い出したのですが、積み立てステーキングのためにbybitに送金した時、もともとあったBTCとかETHとか売買すると計算がめんどう思って、もともとの分は売買していませんでした。

bybitの履歴を見ると、2021-12-16に積み立てステーキングに入れているようでした。

BTC,ETH,USDT,USDCを入れています。

Liquidの履歴にも日本円の引き出しがあり、これらがUSDCになっているわけです。

この辺はLiquidの払い出し履歴でもJPYを引き出しているのが確認できます。(スクショ済み)

勿論送金時に、 JPY→【送金通貨(xrp?)(bch?)】→USDC なわけですが、短期間でこの取引が行われているわけですし、元はJPY建てなので、USDCの取得分をこの時のUSD/JPYの時価で入力とします。

こちらによると、

2021-12-16時点のドル円は113.70円である。

この取得金額をこのレートで入力します。

そもそもBybitの履歴に出てきていない。サポートに問い合わせてもこの辺の履歴が取れていないというのがきつい所だ。

一年前の事だから覚えていたが、定期的に取得していないとまた分からないことになってしまいそうだ。

API連携したので、自動で取引履歴は取れるようになっているが、3か月ごとに取得し直しが必要との事で注意が必要だ。

 

 

GAS サービスアカウント OAuth2 なかなかはまったのでメモ。

 

2023-08-10

現在の問題。

”承認が必要です
このプロジェクトがあなたのデータへのアクセス権限を必要としています。”

GCPのIAMと管理で権限がどうなるかチェックしておこうかな。

つまりプロパティに設定してもそのままではJSONだったので動かなかったという落ちでした。

何が原因なのかBase64charかどうか判定するなどやってようやく解決できました。

 

function findNonBase64Char(PRIVATE_KEY) {
  var base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  for (var i = 0; i < PRIVATE_KEY.length; i++) {
    if (base64Chars.indexOf(PRIVATE_KEY[i]) === -1) {
      Logger.log('Non-Base64 character found at position ' + i + ': ' + PRIVATE_KEY[i]);
    }
  }
}

function test_auth(){
  // Your Google Service Account's email and private key
//  var PRIVATE_KEY = PropertiesService.getScriptProperties().getProperty('PRIVATE_KEY');
 // var PRIVATE_KEY = PropertiesService.getScriptProperties().getProperty('PRIVATE_KEY').trim();
  var PRIVATE_KEY = JSON.parse('"' + PropertiesService.getScriptProperties().getProperty('PRIVATE_KEY').trim() + '"');


  //Logger.log(PRIVATE_KEY);
  var CLIENT_EMAIL = PropertiesService.getScriptProperties().getProperty('CLIENT_EMAIL');

  if (typeof PRIVATE_KEY !== 'string') {
    Logger.log('PRIVATE_KEY is not a string');
    return;
  }
  var match = PRIVATE_KEY.match(/-----BEGIN PRIVATE KEY-----(.*)-----END PRIVATE KEY-----/s);
  if (!match) {
    Logger.log('PRIVATE_KEY does not contain a key');
    return;
  }
  var keyBody = match[1];
  if (!/^[A-Za-z0-9+/= \n]+$/.test(keyBody)) {
  Logger.log('The body of PRIVATE_KEY is not a Base64-encoded string');
  findNonBase64Char(keyBody);
  
  return;
}



  

  // OAuth2 service
  var service = OAuth2.createService('Google Sheets')
    .setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
    .setTokenUrl('https://accounts.google.com/o/oauth2/token')
    .setPrivateKey(PRIVATE_KEY)
    .setIssuer(CLIENT_EMAIL)
    .setPropertyStore(PropertiesService.getScriptProperties())
    .setScope('https://www.googleapis.com/auth/spreadsheets');

  // Reset the service
  service.reset();

  if (!service.hasAccess()) {
    var error = service.getLastError();
    Logger.log('Authentication failed: ' + error);
    return;
  }

  // Spreadsheet ID
  var spreadsheetId = 'これもプロパティから取得すべきかな?';

  // Google Sheets API URL
  var url = 'https://sheets.googleapis.com/v4/spreadsheets/' + spreadsheetId + '?includeGridData=true';

  // HTTP options
  var params = {
    headers: {
      Authorization: 'Bearer ' + service.getAccessToken()
    }
  };

  // Fetch spreadsheet data
  var response = UrlFetchApp.fetch(url, params);
  var data = JSON.parse(response.getContentText());

  // Get the number of columns in the 'log' sheet
  var sheetData = data.sheets.find(function(sheet) {
    return sheet.properties.title === 'log';
  });

  if (sheetData) {
    var cols = sheetData.data[0].rowData[0].values.length;
    Logger.log(cols);
  } else {
    Logger.log('Sheet not found');
  }

  
}