UNPKG

@depay/verify-payment

Version:

A light JavaScript/TypeScript package to decode payment instructions for the DePay payment protocol.

79 lines (76 loc) 2.99 kB
const ARBITRUM_ADDRESS = '0x328FE8bbd30487BB7b5A8eEb909f892E9E229271'; const AVALANCHE_ADDRESS = '0x39E7C98BF4ac3E4C394dD600397f5f7Ee3779BE8'; const BASE_ADDRESS = '0x48825133EF08327535D0b24d73779E82BE6Ea4d9'; const BSC_ADDRESS = '0x5F565EDfB9C446976a9F9910631cfeDb6A87220c'; const ETHEREUM_ADDRESS = '0x365f7B56D2fB16C8Af89D7d33b420E4e013461e8'; const GNOSIS_ADDRESS = '0x328FE8bbd30487BB7b5A8eEb909f892E9E229271'; const OPTIMISM_ADDRESS = '0x558302715e3011Be6695605c11A65526D2ba2245'; const POLYGON_ADDRESS = '0xe04b08Dfc6CaA0F4Ec523a3Ae283Ece7efE00019'; const WORLDCHAIN_ADDRESS = '0x886eb82a7e5E7310F66A0E83748662A17E391eb0'; const SOLANA_ADDRESS = 'DePayR1gQfDmViCPKctnZXNtUgqRwnEqMax8LX9ho1Zg'; const PROTOCOL_ADDRESSES = { 'arbitrum': ARBITRUM_ADDRESS, '42161': ARBITRUM_ADDRESS, '0xa4b1': ARBITRUM_ADDRESS, 'avalanche': AVALANCHE_ADDRESS, '43114': AVALANCHE_ADDRESS, '0xa86a': AVALANCHE_ADDRESS, 'base': BASE_ADDRESS, '8453': BASE_ADDRESS, '0x2105': BASE_ADDRESS, 'bsc': BSC_ADDRESS, '56': BSC_ADDRESS, '0x38': BSC_ADDRESS, 'ethereum': ETHEREUM_ADDRESS, '1': ETHEREUM_ADDRESS, '0x1': ETHEREUM_ADDRESS, 'gnosis': GNOSIS_ADDRESS, '100': GNOSIS_ADDRESS, '0x64': GNOSIS_ADDRESS, 'optimism': OPTIMISM_ADDRESS, '10': OPTIMISM_ADDRESS, '0xa': OPTIMISM_ADDRESS, 'polygon': POLYGON_ADDRESS, '137': POLYGON_ADDRESS, '0x89': POLYGON_ADDRESS, 'solana': SOLANA_ADDRESS, 'worldchain': WORLDCHAIN_ADDRESS, '480': WORLDCHAIN_ADDRESS, '0x1e0': WORLDCHAIN_ADDRESS, }; const verifyAddress = (blockchain, address) => { return PROTOCOL_ADDRESSES[blockchain] === address; }; function splitHexData(data, start, length) { return data.substring(start, start + length); } function parseUint256(data) { return BigInt(`0x${data}`); // Prefix with '0x' to ensure it's treated as a hex value } function parseAddress(data) { return "0x" + data.substring(24); } function decodePayment({ blockchain, address, transaction }) { if (!verifyAddress(blockchain, address)) { return; } if (typeof transaction === 'string' && transaction.match('0x')) { // EVM const method = transaction.substring(2, 10); if (method === 'cac7130c') { // pay(tuple payment) return { amount: parseUint256(splitHexData(transaction, 74, 64)), token: parseAddress(splitHexData(transaction, 458, 64)), receiver: parseAddress(splitHexData(transaction, 650, 64)), }; } else if (method === '64f0acc4') { // pay(tuple payment,tuple permitTransferFromAndSignature) return { amount: parseUint256(splitHexData(transaction, 138, 64)), token: parseAddress(splitHexData(transaction, 522, 64)), receiver: parseAddress(splitHexData(transaction, 714, 64)), }; } } return; } export { PROTOCOL_ADDRESSES, decodePayment };