added web-app and landing
This commit is contained in:
parent
af031877a5
commit
769fa105b8
198 changed files with 22132 additions and 10 deletions
85
web-app/src/utils/blockchain.ts
Normal file
85
web-app/src/utils/blockchain.ts
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
import { type Address, type TypedDataDomain, type Hex, slice, hexToNumber, hexToBigInt, recoverAddress } from "viem";
|
||||
|
||||
|
||||
export function createPermitObject(
|
||||
verifyingContract: Address,
|
||||
fromAddress: Address,
|
||||
spender: Address,
|
||||
nonce: BigInt,
|
||||
deadline: BigInt,
|
||||
value: BigInt,
|
||||
chain: number,
|
||||
domainName: string
|
||||
) {
|
||||
const message = {
|
||||
owner: fromAddress,
|
||||
spender: spender,
|
||||
nonce: nonce,
|
||||
deadline: deadline,
|
||||
value: value,
|
||||
};
|
||||
|
||||
|
||||
const domainType = [
|
||||
{ name: "name", type: "string" },
|
||||
{ name: "version", type: "string" },
|
||||
{ name: "chainId", type: "uint256" },
|
||||
{ name: "verifyingContract", type: "address" },
|
||||
];
|
||||
|
||||
const primaryType: "EIP712Domain" | "Permit" = "Permit";
|
||||
|
||||
const types = {
|
||||
EIP712Domain: domainType,
|
||||
Permit: [
|
||||
{
|
||||
name: "owner",
|
||||
type: "address",
|
||||
},
|
||||
{
|
||||
name: "spender",
|
||||
type: "address",
|
||||
},
|
||||
{
|
||||
name: "value",
|
||||
type: "uint256",
|
||||
},
|
||||
{
|
||||
name: "nonce",
|
||||
type: "uint256",
|
||||
},
|
||||
{
|
||||
name: "deadline",
|
||||
type: "uint256",
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const domain: TypedDataDomain | undefined = {
|
||||
name: domainName,
|
||||
version: "1",
|
||||
chainId: chain,
|
||||
verifyingContract: verifyingContract,
|
||||
};
|
||||
|
||||
return {
|
||||
types,
|
||||
message,
|
||||
domain,
|
||||
primaryType,
|
||||
};
|
||||
}
|
||||
|
||||
export function getSignatureRSV2(sig: `0x${string}`) {
|
||||
// splits the signature to r, s, and v values.
|
||||
// const pureSig = sig.replace("0x", "");
|
||||
const [r, s, v] = [slice(sig, 0, 32), slice(sig, 32, 64), slice(sig, 64, 65)];
|
||||
return { r, s, v: Number(v) };
|
||||
}
|
||||
|
||||
export function getSignatureRSV(signature: `0x${string}`) {
|
||||
const r = signature.slice(0, 66) as `0x${string}`;
|
||||
const s = `0x${signature.slice(66, 130)}` as `0x${string}`;
|
||||
const v = hexToBigInt(`0x${signature.slice(130, 132)}`);
|
||||
return { r, s, v };
|
||||
}
|
||||
135
web-app/src/utils/blockies.ts
Normal file
135
web-app/src/utils/blockies.ts
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
var randseed = new Array(4); // Xorshift: [x, y, z, w] 32 bit values
|
||||
|
||||
interface BlockiesOpt {
|
||||
seed: string;
|
||||
size: number;
|
||||
scale: number;
|
||||
color?: string;
|
||||
bgcolor?: string;
|
||||
spotcolor?: string;
|
||||
}
|
||||
|
||||
export function getBlocky(address: string) {
|
||||
if (!address || typeof address !== "string" ) {
|
||||
return;
|
||||
}
|
||||
console.log("address", address);
|
||||
|
||||
var blockiesData = createIcon({
|
||||
seed: address?.toLowerCase(),
|
||||
size: 8,
|
||||
scale: 4,
|
||||
}).toDataURL();
|
||||
|
||||
return blockiesData;
|
||||
}
|
||||
|
||||
function seedrand(seed: string) {
|
||||
for (var i = 0; i < randseed.length; i++) {
|
||||
randseed[i] = 0;
|
||||
}
|
||||
for (var i = 0; i < seed.length; i++) {
|
||||
randseed[i % 4] = (randseed[i % 4] << 5) - randseed[i % 4] + seed.charCodeAt(i);
|
||||
}
|
||||
}
|
||||
|
||||
function rand() {
|
||||
// based on Java's String.hashCode(), expanded to 4 32bit values
|
||||
var t = randseed[0] ^ (randseed[0] << 11);
|
||||
|
||||
randseed[0] = randseed[1];
|
||||
randseed[1] = randseed[2];
|
||||
randseed[2] = randseed[3];
|
||||
randseed[3] = randseed[3] ^ (randseed[3] >> 19) ^ t ^ (t >> 8);
|
||||
|
||||
return (randseed[3] >>> 0) / ((1 << 31) >>> 0);
|
||||
}
|
||||
|
||||
function createColor() {
|
||||
//saturation is the whole color spectrum
|
||||
var h = Math.floor(rand() * 360);
|
||||
//saturation goes from 40 to 100, it avoids greyish colors
|
||||
var s = rand() * 60 + 40 + "%";
|
||||
//lightness can be anything from 0 to 100, but probabilities are a bell curve around 50%
|
||||
var l = (rand() + rand() + rand() + rand()) * 25 + "%";
|
||||
|
||||
var color = "hsl(" + h + "," + s + "," + l + ")";
|
||||
return color;
|
||||
}
|
||||
|
||||
function createImageData(size: number) {
|
||||
var width = size; // Only support square icons for now
|
||||
var height = size;
|
||||
|
||||
var dataWidth = Math.ceil(width / 2);
|
||||
var mirrorWidth = width - dataWidth;
|
||||
|
||||
var data = [];
|
||||
for (var y = 0; y < height; y++) {
|
||||
var row = [];
|
||||
for (var x = 0; x < dataWidth; x++) {
|
||||
// this makes foreground and background color to have a 43% (1/2.3) probability
|
||||
// spot color has 13% chance
|
||||
row[x] = Math.floor(rand() * 2.3);
|
||||
}
|
||||
var r = row.slice(0, mirrorWidth);
|
||||
r.reverse();
|
||||
row = row.concat(r);
|
||||
|
||||
for (var i = 0; i < row.length; i++) {
|
||||
data.push(row[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
function buildOpts(opts: any) {
|
||||
var newOpts: any = {};
|
||||
newOpts.seed = opts.seed || Math.floor(Math.random() * Math.pow(10, 16)).toString(16);
|
||||
|
||||
seedrand(newOpts.seed);
|
||||
|
||||
newOpts.size = opts.size || 8;
|
||||
newOpts.scale = opts.scale || 4;
|
||||
newOpts.color = opts.color || createColor();
|
||||
newOpts.bgcolor = opts.bgcolor || createColor();
|
||||
newOpts.spotcolor = opts.spotcolor || createColor();
|
||||
|
||||
return newOpts;
|
||||
}
|
||||
|
||||
function renderIcon(opts: BlockiesOpt, canvas: HTMLCanvasElement) {
|
||||
opts = buildOpts(opts || {});
|
||||
var imageData = createImageData(opts.size);
|
||||
var width = Math.sqrt(imageData.length);
|
||||
|
||||
canvas.width = canvas.height = opts.size * opts.scale;
|
||||
|
||||
var cc = canvas.getContext("2d")!;
|
||||
cc.fillStyle = opts.bgcolor!;
|
||||
cc.fillRect(0, 0, canvas.width, canvas.height);
|
||||
cc.fillStyle = opts.color!;
|
||||
|
||||
for (var i = 0; i < imageData.length; i++) {
|
||||
// if data is 0, leave the background
|
||||
if (imageData[i]) {
|
||||
var row = Math.floor(i / width);
|
||||
var col = i % width;
|
||||
|
||||
// if data is 2, choose spot color, if 1 choose foreground
|
||||
cc.fillStyle = imageData[i] == 1 ? opts.color! : opts.spotcolor!;
|
||||
|
||||
cc.fillRect(col * opts.scale, row * opts.scale, opts.scale, opts.scale);
|
||||
}
|
||||
}
|
||||
return canvas;
|
||||
}
|
||||
|
||||
export function createIcon(opts: BlockiesOpt) {
|
||||
var canvas = document.createElement("canvas");
|
||||
|
||||
renderIcon(opts, canvas);
|
||||
|
||||
return canvas;
|
||||
}
|
||||
21
web-app/src/utils/converter.ts
Normal file
21
web-app/src/utils/converter.ts
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
/**
|
||||
* @notice Converts Harberg token assets to shares of the total staking pool.
|
||||
* @param assets Number of Harberg tokens to convert.
|
||||
* @param totalSupply Total supply of shares.
|
||||
* @param harbergTotalSupply Total supply of Harberg tokens.
|
||||
* @returns Number of shares corresponding to the input assets.
|
||||
*/
|
||||
export function assetsToShares(assets: bigint, totalSupply: bigint, harbergTotalSupply: bigint): bigint {
|
||||
return (assets * totalSupply) / harbergTotalSupply;
|
||||
}
|
||||
|
||||
/**
|
||||
* @notice Converts shares of the total staking pool back to Harberg token assets.
|
||||
* @param shares Number of shares to convert.
|
||||
* @param totalSupply Total supply of shares.
|
||||
* @param harbergTotalSupply Total supply of Harberg tokens.
|
||||
* @returns The equivalent number of Harberg tokens for the given shares.
|
||||
*/
|
||||
export function sharesToAssets(shares: bigint, totalSupply: bigint, harbergTotalSupply: bigint): bigint {
|
||||
return (shares * harbergTotalSupply) / totalSupply;
|
||||
}
|
||||
64
web-app/src/utils/helper.ts
Normal file
64
web-app/src/utils/helper.ts
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
import { formatUnits } from 'viem'
|
||||
|
||||
|
||||
export function getAddressShortName(address: string) {
|
||||
if (!address) {
|
||||
return "";
|
||||
}
|
||||
const addressBegin = address.substring(0, 6);
|
||||
const addressEnd = address.substring(address.length - 4, address.length);
|
||||
return addressBegin + "..." + addressEnd;
|
||||
}
|
||||
|
||||
export function compactNumber(number: number) {
|
||||
return Intl.NumberFormat("en-US", {
|
||||
notation: "compact",
|
||||
// minimumFractionDigits: 2,
|
||||
maximumFractionDigits: 2,
|
||||
}).format(number);
|
||||
}
|
||||
|
||||
export function formatBigNumber(number: bigint, decimals: number, digits: number = 5) {
|
||||
let bigIntNumber = number;
|
||||
if(!bigIntNumber){
|
||||
bigIntNumber = BigInt(0)
|
||||
}
|
||||
const formattedNumber = Number(formatUnits(bigIntNumber, decimals))
|
||||
if(formattedNumber === 0){
|
||||
return "0"
|
||||
}
|
||||
return formattedNumber.toFixed(digits)
|
||||
}
|
||||
|
||||
|
||||
|
||||
export function bigInt2Number(number: bigint, decimals: number) {
|
||||
let bigIntNumber = number;
|
||||
if(!bigIntNumber){
|
||||
bigIntNumber = BigInt(0)
|
||||
}
|
||||
const formattedNumber = Number(formatUnits(bigIntNumber, decimals))
|
||||
return formattedNumber
|
||||
}
|
||||
|
||||
export function InsertCommaNumber(number: any) {
|
||||
if (!number) {
|
||||
return 0;
|
||||
}
|
||||
const formattedWithOptions = number.toLocaleString("en-US");
|
||||
return formattedWithOptions;
|
||||
}
|
||||
|
||||
export function formatBigIntDivision(nominator: bigint, denominator: bigint, digits: number = 2) {
|
||||
if (!nominator) {
|
||||
return 0;
|
||||
}
|
||||
let display = nominator.toString();
|
||||
const decimal = (Number(denominator) / 10).toString().length;
|
||||
|
||||
let [integer, fraction] = [display.slice(0, display.length - decimal), display.slice(display.length - decimal)];
|
||||
|
||||
// output type number
|
||||
return Number(integer + "." + fraction);
|
||||
}
|
||||
|
||||
23
web-app/src/utils/logger.ts
Normal file
23
web-app/src/utils/logger.ts
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
export function info(text: string, data: any = null ){
|
||||
if(data){
|
||||
console.log(`%c ${text}`, 'color: #17a2b8', data);
|
||||
|
||||
} else{
|
||||
console.log(`%c ${text}`, 'color: #17a2b8');
|
||||
}
|
||||
}
|
||||
|
||||
export function contract(text: string, data: any = null ){
|
||||
if(data){
|
||||
console.log(`%c ${text}`, 'color: #8732a8', data);
|
||||
|
||||
} else{
|
||||
console.log(`%c ${text}`, 'color: #8732a8');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export default {
|
||||
info,
|
||||
contract
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue