Skip to content

Instantly share code, notes, and snippets.

@sergiocampama
Last active June 24, 2022 18:04
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sergiocampama/7919632 to your computer and use it in GitHub Desktop.
Save sergiocampama/7919632 to your computer and use it in GitHub Desktop.
Google Spreadsheet Cryptoscrypt

Google Spreadsheet Cryptoscrypt

Google Spreadsheet scripts for Coinbase and USD/BTC and USD/other currencies.

If you found this useful, donate XMR!: 44WvZj9zRXqgq3jHpemt8dLt29aDRQqdiK6ivxoCf3e65cdXbzBnHJyc2CdGWeGr36f5MBkqQBb61hus34nUVae4ND2PKx4

Made with love from Chile

/**
* cryptocoins.gs v2.0
* Sergio Campamá 2013 - 2017
* http://kaipi.me
* @sergiocampama
* License: DonationWare
* If you found this useful, please donate XMR to 44WvZj9zRXqgq3jHpemt8dLt29aDRQqdiK6ivxoCf3e65cdXbzBnHJyc2CdGWeGr36f5MBkqQBb61hus34nUVae4ND2PKx4
*
* The `nonce` params on some functions are to invalidate the Spreadsheet's cache, just input in
* a cell with a random value and change it when you want to refresh.
*
* [22-01-2014] - Added `getCryptsyBalanceForCoin` and `getCryptsyRateForCoin` as proposed by @cosmicdice
* [26-01-2014] - Added support for rates in other markets as proposed by @elmer1000
* [28-01-2014] - Added `getActiveCryptsyBalances` that returns an array with active balances in Cryptsy
* [02-01-2017] - Remove Cryptsy crap after they stole everything from me. Added Coinbase read balance support.
*/
var COINBASE_PUBLIC_KEY = "<COINBASE_PUBLIC_KEY>";
var COINBASE_PRIVATE_KEY = "<COINBASE_PRIVATE_KEY>";
var OPENEXCHANGERATE_API_KEY = "<OPENEXCHANGE_API_KEY>";
function getUSDtoCurrency(currency, nonce) {
const response = UrlFetchApp.fetch("https://openexchangerates.org/api/latest.json?app_id=" + OPENEXCHANGERATE_API_KEY);
return JSON.parse(response)["rates"][currency];
}
function getXMRtoUSD(nonce) {
const response = UrlFetchApp.fetch("https://api.coinmarketcap.com/v1/ticker/monero");
return JSON.parse(response)[0]["price_usd"];
}
function coinbaseGetAccountBalance(accountId, nonce) {
return coinbaseRequest("GET", "/v2/accounts/" + accountId, true)["balance"]["amount"];
}
function coinbaseGetUSDRate(nonce) {
return coinbaseRequest("GET", "/v2/exchange-rates?currency=BTC", false)["rates"]["USD"];
}
var coinbaseGetTimestamp = function() {
return coinbaseRequest("GET", "/v2/time", false)["epoch"];
}
var coinbaseRequest = function(method, requestPath, authRequired) {
if (authRequired) {
const timestamp = coinbaseGetTimestamp();
const prehash = timestamp + method + requestPath;
const signature = hmac_hash(prehash, COINBASE_PRIVATE_KEY);
var options = {
headers: {
"CB-ACCESS-KEY": COINBASE_PUBLIC_KEY,
"CB-ACCESS-SIGN": signature,
"CB-ACCESS-TIMESTAMP": timestamp,
"CB-VERSION": "2016-02-05"
},
method: method
}
} else {
var options = {
method: method
};
}
const response = UrlFetchApp.fetch("https://api.coinbase.com" + requestPath, options);
return JSON.parse(response)["data"];
}
var hmac_hash = function(params, private_key) {
const hash = CryptoJS.HmacSHA256(params, private_key).toString();
return hash;
}
/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS=CryptoJS||function(h,s){var f={},g=f.lib={},q=function(){},m=g.Base={extend:function(a){q.prototype=this;var c=new q;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
r=g.WordArray=m.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||k).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e<a;e++)c[b+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)c[b+e>>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d<a;d+=4)c.push(4294967296*h.random()|0);return new r.init(c,a)}}),l=f.enc={},k=l.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++){var e=c[b>>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b+=2)d[b>>>3]|=parseInt(a.substr(b,
2),16)<<24-4*(b%8);return new r.init(d,c/2)}},n=l.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++)d.push(String.fromCharCode(c[b>>>2]>>>24-8*(b%4)&255));return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b++)d[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new r.init(d,c)}},j=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},
u=g.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=j.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var g=0;g<a;g+=e)this._doProcessBlock(d,g);g=d.splice(0,a);c.sigBytes-=b}return new r.init(g,b)},clone:function(){var a=m.clone.call(this);
a._data=this._data.clone();return a},_minBufferSize:0});g.Hasher=u.extend({cfg:m.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,d){return(new a.init(d)).finalize(c)}},_createHmacHelper:function(a){return function(c,d){return(new t.HMAC.init(a,
d)).finalize(c)}}});var t=f.algo={};return f}(Math);
(function(h){for(var s=CryptoJS,f=s.lib,g=f.WordArray,q=f.Hasher,f=s.algo,m=[],r=[],l=function(a){return 4294967296*(a-(a|0))|0},k=2,n=0;64>n;){var j;a:{j=k;for(var u=h.sqrt(j),t=2;t<=u;t++)if(!(j%t)){j=!1;break a}j=!0}j&&(8>n&&(m[n]=l(h.pow(k,0.5))),r[n]=l(h.pow(k,1/3)),n++);k++}var a=[],f=f.SHA256=q.extend({_doReset:function(){this._hash=new g.init(m.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],g=b[2],j=b[3],h=b[4],m=b[5],n=b[6],q=b[7],p=0;64>p;p++){if(16>p)a[p]=
c[d+p]|0;else{var k=a[p-15],l=a[p-2];a[p]=((k<<25|k>>>7)^(k<<14|k>>>18)^k>>>3)+a[p-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+a[p-16]}k=q+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&m^~h&n)+r[p]+a[p];l=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&g^f&g);q=n;n=m;m=h;h=j+k|0;j=g;g=f;f=e;e=k+l|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+g|0;b[3]=b[3]+j|0;b[4]=b[4]+h|0;b[5]=b[5]+m|0;b[6]=b[6]+n|0;b[7]=b[7]+q|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=q.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=q._createHelper(f);s.HmacSHA256=q._createHmacHelper(f)})(Math);
(function(){var h=CryptoJS,s=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(f,g){f=this._hasher=new f.init;"string"==typeof g&&(g=s.parse(g));var h=f.blockSize,m=4*h;g.sigBytes>m&&(g=f.finalize(g));g.clamp();for(var r=this._oKey=g.clone(),l=this._iKey=g.clone(),k=r.words,n=l.words,j=0;j<h;j++)k[j]^=1549556828,n[j]^=909522486;r.sigBytes=l.sigBytes=m;this.reset()},reset:function(){var f=this._hasher;f.reset();f.update(this._iKey)},update:function(f){this._hasher.update(f);return this},finalize:function(f){var g=
this._hasher;f=g.finalize(f);g.reset();return g.finalize(this._oKey.clone().concat(f))}})})();
@sergiocampama
Copy link
Author

Invalidated previous private key, forgot to remove it.

@sergiocampama
Copy link
Author

made the cryptsy request more flexible

@sergiocampama
Copy link
Author

added methods to get rates and balances for any coin in cryptsy, based on work by @cosmicdice

@sergiocampama
Copy link
Author

added support for LTC and XPM market rates

@sergiocampama
Copy link
Author

added method to get array of active balances in cryptsy

@Sv1ngen
Copy link

Sv1ngen commented Jan 30, 2014

Hi there

Found your script and been playing with if for a while. But im not a coder and i have a hard to understand
what exactly i need to do in a google spreadsheet to get it to work. I got the BTCtoUSD to work but thats it.
Is it possible that you can whip up a google spreadsheet with some examples (stuff that don't need your privatekey)

Would appriciate it :)

Copy link

ghost commented Mar 16, 2014

can someone please help me to use this script? i have tried about 2 hours to make it work using Google Spreadsheet but i still get this error: Script function not found: doGet

Can someone provide the full steps that need to be done in order to get this script working?
Create a new spreadsheet, script editor (what to choose there) full code to be pasted where i will add my api keys and maybe deploy as web app or what need to be done next, thanks a lot !
thank you

@sergiocampama
Copy link
Author

Sorry, didn't see these last comments, I didn't get an email... I'll make a semi-working example, as you'll need your private keys from cryptsy

@sergiocampama
Copy link
Author

Here's an example of how I use it (specific for chilean transactions, but can be easily modified to another currency). You'll want to copy this spreadsheet and use it privately, as you'll have to put your private keys in the script editor.

https://docs.google.com/spreadsheet/ccc?key=0AmOUwuTrJCuUdHc4eGFndy1rWGlJZzQ2dU5VQmZRWFE&usp=sharing

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment