// Sign the Binance account balance URL — pure-JS HMAC (crypto blocked in n8n sandbox) const API_KEY = 'kFYcAx3hJjlAtxbtSjl0DuY1s6zIXLm0YNnwhEqueWMkHvOEAkyBfAAGGfJTfoJS'; const SECRET_KEY = 'x7Em12CzxC7bTWmCUah7W6Q8DAFiZgXkmzRRLJnxnaJyAdmQtcCkU4Spun7QjYMt'; function sha256(msgBytes) { const K = [0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2]; let h = [0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19]; const ml = msgBytes.length * 8; msgBytes.push(0x80); while (msgBytes.length % 64 !== 56) msgBytes.push(0); for (let i = 56; i >= 0; i -= 8) msgBytes.push((ml / Math.pow(2, i)) & 0xff); for (let i = 0; i < msgBytes.length; i += 64) { const w = []; for (let j = 0; j < 16; j++) w[j] = (msgBytes[i+j*4]<<24)|(msgBytes[i+j*4+1]<<16)|(msgBytes[i+j*4+2]<<8)|msgBytes[i+j*4+3]; for (let j = 16; j < 64; j++) { const s0 = (w[j-15]>>>7|w[j-15]<<25)^(w[j-15]>>>18|w[j-15]<<14)^(w[j-15]>>>3); const s1 = (w[j-2]>>>17|w[j-2]<<15)^(w[j-2]>>>19|w[j-2]<<13)^(w[j-2]>>>10); w[j] = (w[j-16]+s0+w[j-7]+s1) >>> 0; } let [a,b,c,d,e,f,g,hh] = h; for (let j = 0; j < 64; j++) { const S1 = (e>>>6|e<<26)^(e>>>11|e<<21)^(e>>>25|e<<7); const ch = (e&f)^(~e&g); const t1 = (hh+S1+ch+K[j]+w[j]) >>> 0; const S0 = (a>>>2|a<<30)^(a>>>13|a<<19)^(a>>>22|a<<10); const maj = (a&b)^(a&c)^(b&c); const t2 = (S0+maj) >>> 0; hh=g; g=f; f=e; e=(d+t1)>>>0; d=c; c=b; b=a; a=(t1+t2)>>>0; } h = h.map((v,i)=>[a,b,c,d,e,f,g,hh][i]+v>>>0); } return h.map(v=>v.toString(16).padStart(8,'0')).join(''); } function strToBytes(s) { return Array.from(s).map(c => c.charCodeAt(0) & 0xff); } function hmacSha256(key, msg) { let k = strToBytes(key); const blockSize = 64; if (k.length > blockSize) { const h = sha256([...k]); k = h.match(/../g).map(x => parseInt(x,16)); } while (k.length < blockSize) k.push(0); const ipad = k.map(b => b ^ 0x36); const opad = k.map(b => b ^ 0x5c); const innerBytes = sha256([...ipad, ...strToBytes(msg)]).match(/../g).map(x => parseInt(x,16)); return sha256([...opad, ...innerBytes]); } const ts = Date.now(); const qs = 'recvWindow=5000×tamp=' + ts; const sig = hmacSha256(SECRET_KEY, qs); const url = 'https://api.binance.com/api/v3/account?' + qs + '&signature=' + sig; // Pass the full Decision Engine output through so Build Order Request can read it const dec = $input.first().json; return [{ json: { url, apiKey: API_KEY, decision: dec, action: dec.action, trade: dec.trade } }];