Smart Contracts
Set Score

Set Sore

To set the Score you need to follow the next steps:

  1. Get transaction value
  2. Get nonce;
  3. Get Score data from Nomis API;
  4. Execute setScore function in the contract with the data API response.
  5. Confirm transaction.

Transaction Value

Value of the transaction may be 0 if the account is whitelisted. Or it may seted individually (ex. for contest winners) for the account or it may be the default value.

Here is an example for the Multichain Score on the Polygon chain:

import { type Address, createPublicClient, getContract, http } from "viem";
import { polygon } from "viem/chains";
 
import { abi } from "./abi";
 
const calculationModel = 11;
const id = 9999999999999n;
 
const publicClient = createPublicClient({
  chain: polygon,
  transport: http(),
});
 
const contract = getContract({
  abi,
  address: "0x4724F4B3936B4c2d52f8F452719870c5d4c86b4D",
  client: publicClient,
});
 
const getValue = async (address: Address) => {
  try {
    // if account is whitelisted both mint and update fees are 0
    const isWhitelisted = await contract.read.whitelist([
      address,
      calculationModel,
    ]);
    if (isWhitelisted) return 0n;
 
    const [score] = await contract.read.getScore([
      address,
      chainId,
      calculationModel,
    ]);
 
    // update
    if (score !== 0) {
      const individual = await contract.read.getIndividualUpdateFee([
        address,
        calculationModel,
      ]);
      if (individual !== 0n) return individual;
      return await contract.read.getUpdateFee();
    }
 
    // mint
    const individual = await contract.read.getIndividualMintFee([
      address,
      calculationModel,
    ]);
    if (individual !== 0n) return individual;
    return await contract.read.getMintFee();
  } catch (error) {
    console.error(error);
  }
};
 
console.log(await getValue("0x..."));

Nonce

Nonce is a number that is used to prevent replay attacks

const getNonce = async (address: Address) => {
  return await contract.read.getNonce([address]);
};
 
console.log(await getNonce("0x..."));

Score Data

To get the Score data you need to call the Nomis Wallet Stats API with the wallet's address and other configurations.

ScoreChainStats API slugModelId
Astar zkEVM logoAstar zkEVMAstar zkEVM logoAstar zkEVMastar-zkevm11 (Common V3)3776
Berachain Artio Testnet logoBerachain Artio TestnetBerachain Artio logoBerachain Artioberachain11 (Common V3)80085
Blast logoBlastBlast logoBlastblast11 (Common V3)81457
Blast Sepolia Testnet logoBlast Sepolia TestnetBlast Sepolia logoBlast Sepoliablast-sepolia11 (Common V3)81457
Core logoCoreCore Dao logoCore Daokroma11 (Common V3)1116
Cronos logoCronosCronos Mainnet logoCronos Mainnetcronos11 (Common V3)25
Cross-Chain DeFi logoCross-Chain DeFiOP Mainnet logoOP Mainnetrubic5 (Rubic)22202022
Energi logoEnergiEnergi logoEnergienergi11 (Common V3)39797
Enuls logoEnulsEnuls logoEnulsenuls11 (Common V3)119
EYWA logoEYWAPolygon logoPolygoneywa21 (Eywa)137
Gnosis logoGnosisGnosis logoGnosisgnosis11 (Common V3)100
Kroma logoKromaKroma logoKromakroma11 (Common V3)255
LayerZero logoLayerZeroArbitrum One logoArbitrum Onelayerzero12 (LayerZero)11101011
LightLink logoLightLinkLightLink Phoenix Mainnet logoLightLink Phoenix Mainnetlightlink11 (Common V3)1890
Linea logoLineaLinea Mainnet logoLinea Mainnetlinea14 (Linea)59144
Manta logoMantaManta Pacific Mainnet logoManta Pacific Mainnetmanta19 (Manta)169
Metis logoMetisMetis logoMetismetis11 (Common V3)1088
Mint logoMintMint Mainnet logoMint Mainnetsei11 (Common V3)888080688
Mode logoModeMode Mainnet logoMode Mainnetmode11 (Common V3)34443
Moonbeam logoMoonbeamMoonbeam logoMoonbeammoonbeam11 (Common V3)1284
Multichain logoMultichainPolygon logoPolygonmultichain11 (Common V3)9999999999999
Neon EVM logoNeon EVMNeon EVM MainNet logoNeon EVM MainNetneon11 (Common V3)245022934
opBNB logoopBNBopBNB logoopBNBopbnb11 (Common V3)59144
Plume Testnet logoPlume TestnetPlume Testnet logoPlume Testnetplume11 (Common V3)161221135
Polygon zkEVM logoPolygon zkEVMPolygon zkEVM logoPolygon zkEVMzkevm11 (Common V3)1101
Scroll logoScrollScroll logoScrollscroll16 (Scroll)534352
Sei logoSeiSei Network logoSei Networksei11 (Common V3)888080688
Taiko Katla Testnet logoTaiko Katla TestnetTaiko Katla Testnet logoTaiko Katla Testnettaiko11 (Common V3)167008
Web3 Social logoWeb3 SocialCyber logoCyberweb3social22 (Web3 Social)888080688
ZetaChain Testnet logoZetaChain TestnetZetaChain Athens Testnet logoZetaChain Athens Testnetzetchain11 (Common V3)7001
ZKFair logoZKFairZKFair Mainnet logoZKFair Mainnetzkfair11 (Common V3)42766
zkLink Nova logozkLink NovazkLink Nova logozkLink Novazklinknova11 (Common V3)810180
zkSync logozkSynczkSync Era logozkSync Erazksyncera11 (Common V3)324
const getScoreData = async (address: string) => {
  try {
    const searchParams = new SearchParams({
      nonce: await getNonce(address),
      deadline: Date.now() + 1000 * 60 * 60 * 24, // time given to the user to sign the transaction
      calculationModel,
      chainId,
    });
 
    const res = await fetch(
      `https://api.nomis.com/api/v1/${apiSlug}/wallet/${address}/score?${searchParams.toString()}`
    );
 
    const data = await res.json();
    return { score: data.score, ...mintData };
  } catch (error) {
    console.error(error);
  }
};

You will get an mintData object in the response:

type MintData = {
  signature: string;
  mintedScore: number;
  calculationModel: number;
  deadline: number;
  metadataUrl: string;
  chainId: number;
  referralCode: string;
  referrerCode: string;
  onftMetadataUrl: string;
  mintedChain: {...};
};

Transaction

To set the Score you need to call the setScore function in the contract with the data API response.

const scoreData = {...} // data from the API response
 
const setScore = async (address: Address) => {
  try {
    const scoreData = getScoreData(address);
 
    const trx = contract.write.setScore([
      scoreData.signature,
      scoreData.score,
      scoreData.calculationModel,
      scoreData.deadline,
      scoreData.metadataUrl,
      scoreData.chainId,
      scoreData.referralCode,
      scoreData.referrerCode
    ])
  } catch (error) {
    console.error(error)
  }
}