@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
JavaScript
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 };