Skip to content

Commit

Permalink
added mumbai credit score support
Browse files Browse the repository at this point in the history
lots of refactor
  • Loading branch information
H34D committed Apr 5, 2023
1 parent 9564026 commit 0e432d2
Show file tree
Hide file tree
Showing 52 changed files with 1,572 additions and 601 deletions.
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -35,7 +35,7 @@
"author": "Masa Finance",
"license": "MIT",
"dependencies": {
"@masa-finance/masa-contracts-identity": "^1.4.4",
"@masa-finance/masa-contracts-identity": "^1.5.2",
"@masa-finance/masa-token": "^1.0.0",
"arweave": "1.11.8",
"axios": "^1.3.2",
Expand Down
37 changes: 24 additions & 13 deletions src/contracts/load-Identity-contracts.ts
Expand Up @@ -13,7 +13,7 @@ import {
SoulStore__factory,
} from "@masa-finance/masa-contracts-identity";
import { constants, providers } from "ethers";
import { IIdentityContracts, NetworkName } from "../interface";
import { ContractInfo, IIdentityContracts, NetworkName } from "../interface";
import { addresses } from "./addresses";

export interface LoadContractArgs {
Expand All @@ -35,40 +35,51 @@ export const loadIdentityContracts = ({
window.ethereum
);

const SoulboundIdentityContract: SoulboundIdentity =
const SoulboundIdentityContract: SoulboundIdentity & ContractInfo =
SoulboundIdentity__factory.connect(
addresses[networkName]?.SoulboundIdentityAddress || constants.AddressZero,
loadedProvider
);
SoulboundIdentityContract.hasAddress =
!!addresses[networkName]?.SoulboundIdentityAddress;

const SoulboundCreditScoreContract: SoulboundCreditScore =
const SoulboundCreditScoreContract: SoulboundCreditScore & ContractInfo =
SoulboundCreditScore__factory.connect(
addresses[networkName]?.SoulboundCreditScoreAddress ||
constants.AddressZero,
loadedProvider
);
SoulboundCreditScoreContract.hasAddress =
!!addresses[networkName]?.SoulboundCreditScoreAddress;

const SoulNameContract: SoulName = SoulName__factory.connect(
const SoulNameContract: SoulName & ContractInfo = SoulName__factory.connect(
addresses[networkName]?.SoulNameAddress || constants.AddressZero,
loadedProvider
);
SoulNameContract.hasAddress = !!addresses[networkName]?.SoulNameAddress;

const SoulLinkerContract: SoulLinker = SoulLinker__factory.connect(
addresses[networkName]?.SoulLinkerAddress || constants.AddressZero,
loadedProvider
);
const SoulLinkerContract: SoulLinker & ContractInfo =
SoulLinker__factory.connect(
addresses[networkName]?.SoulLinkerAddress || constants.AddressZero,
loadedProvider
);
SoulLinkerContract.hasAddress = !!addresses[networkName]?.SoulLinkerAddress;

const SoulStoreContract: SoulStore = SoulStore__factory.connect(
addresses[networkName]?.SoulStoreAddress || constants.AddressZero,
loadedProvider
);
const SoulStoreContract: SoulStore & ContractInfo =
SoulStore__factory.connect(
addresses[networkName]?.SoulStoreAddress || constants.AddressZero,
loadedProvider
);
SoulStoreContract.hasAddress = !!addresses[networkName]?.SoulStoreAddress;

const SoulboundGreenContract: SoulboundGreen =
const SoulboundGreenContract: SoulboundGreen & ContractInfo =
SoulboundGreen__factory.connect(
// this might be empty
addresses[networkName]?.SoulboundGreenAddress || constants.AddressZero,
loadedProvider
);
SoulboundGreenContract.hasAddress =
!!addresses[networkName]?.SoulboundGreenAddress;

return {
SoulboundIdentityContract,
Expand Down
11 changes: 8 additions & 3 deletions src/contracts/masa-contracts.ts
@@ -1,9 +1,14 @@
import { IIdentityContracts } from "../interface";
import Masa from "../masa";
import { loadIdentityContracts } from "./index";
import { CreditScore, Green, Identity, SoulName } from "./modules";
import { SBT } from "./modules/sbt";
import { SoulLinker } from "./modules/soul-linker";
import {
CreditScore,
Green,
Identity,
SBT,
SoulLinker,
SoulName,
} from "./modules";
import { MasaBase } from "../helpers/masa-base";
import { Log } from "@ethersproject/abstract-provider";
import { BaseContract } from "ethers";
Expand Down
103 changes: 81 additions & 22 deletions src/contracts/modules/credit-score.ts
@@ -1,7 +1,7 @@
import { isNativeCurrency, PaymentMethod } from "../../interface";
import { BigNumber } from "@ethersproject/bignumber";
import { ContractTransaction, TypedDataDomain, Wallet } from "ethers";
import { generateSignatureDomain, signTypedData } from "../../utils";
import { generateSignatureDomain, Messages, signTypedData } from "../../utils";
import { MasaModuleBase } from "./masa-module-base";

export class CreditScore extends MasaModuleBase {
Expand Down Expand Up @@ -77,7 +77,6 @@ export class CreditScore extends MasaModuleBase {
authorityAddress,
signatureDate,
};

const domain: TypedDataDomain = await generateSignatureDomain(
this.masa.config.wallet as Wallet,
"SoulboundCreditScore",
Expand Down Expand Up @@ -106,7 +105,21 @@ export class CreditScore extends MasaModuleBase {
price
);

const creditScoreMintParameters: [
// connect
const {
estimateGas: {
"mint(address,uint256,address,uint256,bytes)": estimateGas,
},
"mint(address,uint256,address,uint256,bytes)": mint,
} = await this.instances.SoulboundCreditScoreContract.connect(
this.masa.config.wallet
);

const creditScoreMintOverrides = {
value: isNativeCurrency(paymentMethod) ? price : undefined,
};

const creditScoreMintParametersIdentity: [
string,
BigNumber,
string,
Expand All @@ -120,29 +133,34 @@ export class CreditScore extends MasaModuleBase {
signature,
];

const creditScoreMintOverrides = {
value: price,
};

if (this.masa.config.verbose) {
console.log({ creditScoreMintParameters, creditScoreMintOverrides });
}
// estimate gas
let gasLimit: BigNumber = await estimateGas(
...creditScoreMintParametersIdentity,
creditScoreMintOverrides
);

// connect
const creditScoreContract =
await this.instances.SoulboundCreditScoreContract.connect(
this.masa.config.wallet
if (this.masa.config.network?.gasSlippagePercentage) {
gasLimit = this.addSlippage(
gasLimit,
this.masa.config.network.gasSlippagePercentage
);
}

// estimate
const gasLimit = await creditScoreContract.estimateGas[
"mint(address,uint256,address,uint256,bytes)"
](...creditScoreMintParameters, creditScoreMintOverrides);
const creditScoreMintOverridesWithGasLimit = {
...creditScoreMintOverrides,
gasLimit,
};
if (this.masa.config.verbose) {
console.info({
creditScoreMintParametersIdentity,
creditScoreMintOverridesWithGasLimit,
});
}

// execute
return creditScoreContract["mint(address,uint256,address,uint256,bytes)"](
...creditScoreMintParameters,
{ ...creditScoreMintOverrides, gasLimit }
return mint(
...creditScoreMintParametersIdentity,
creditScoreMintOverridesWithGasLimit
);
};

Expand All @@ -161,8 +179,8 @@ export class CreditScore extends MasaModuleBase {
| undefined
> => {
const signatureDate = Math.floor(Date.now() / 1000);

const authorityAddress = await this.masa.config.wallet.getAddress();

const value: {
identityId: BigNumber;
authorityAddress: string;
Expand Down Expand Up @@ -193,4 +211,45 @@ export class CreditScore extends MasaModuleBase {

return { signature, signatureDate, authorityAddress };
};

/**
*
* @param creditScoreId
*/
burn = async (creditScoreId: BigNumber): Promise<boolean> => {
console.log(`Burning Credit Score with ID '${creditScoreId}'!`);

try {
const {
estimateGas: { burn: estimateGas },
burn,
} = this.masa.contracts.instances.SoulboundCreditScoreContract.connect(
this.masa.config.wallet
);

let gasLimit: BigNumber = await estimateGas(creditScoreId);
if (this.masa.config.network?.gasSlippagePercentage) {
gasLimit = this.addSlippage(
gasLimit,
this.masa.config.network.gasSlippagePercentage
);
}

const { wait, hash } = await burn(creditScoreId, {
gasLimit,
});

console.log(Messages.WaitingToFinalize(hash));
await wait();

console.log(`Burned Credit Score with ID '${creditScoreId}'!`);
return true;
} catch (error: unknown) {
if (error instanceof Error) {
console.error(`Burning Credit Score Failed! '${error.message}'`);
}
}

return false;
};
}
71 changes: 61 additions & 10 deletions src/contracts/modules/green.ts
@@ -1,7 +1,7 @@
import { isNativeCurrency, PaymentMethod } from "../../interface";
import { BigNumber } from "@ethersproject/bignumber";
import { ContractTransaction, TypedDataDomain, Wallet } from "ethers";
import { generateSignatureDomain, signTypedData } from "../../utils";
import { generateSignatureDomain, Messages, signTypedData } from "../../utils";
import { MasaModuleBase } from "./masa-module-base";

export class Green extends MasaModuleBase {
Expand Down Expand Up @@ -141,28 +141,38 @@ export class Green extends MasaModuleBase {
];

const greenMintOverrides = {
value: price,
value: isNativeCurrency(paymentMethod) ? price : undefined,
};

if (this.masa.config.verbose) {
console.log({ greenMintParameters, greenMintOverrides });
}

// connect
const contract = await this.instances.SoulboundGreenContract.connect(
const {
estimateGas: {
"mint(address,address,address,uint256,bytes)": estimateGas,
},
"mint(address,address,address,uint256,bytes)": mint,
} = await this.instances.SoulboundGreenContract.connect(
this.masa.config.wallet
);

// estimate gas
const gasLimit = contract.estimateGas[
"mint(address,address,address,uint256,bytes)"
](...greenMintParameters, greenMintOverrides);

// execute
return contract["mint(address,address,address,uint256,bytes)"](
let gasLimit: BigNumber = await estimateGas(
...greenMintParameters,
{ ...greenMintOverrides, gasLimit }
greenMintOverrides
);

if (this.masa.config.network?.gasSlippagePercentage) {
gasLimit = this.addSlippage(
gasLimit,
this.masa.config.network.gasSlippagePercentage
);
}

// execute
return mint(...greenMintParameters, { ...greenMintOverrides, gasLimit });
};

/**
Expand Down Expand Up @@ -212,4 +222,45 @@ export class Green extends MasaModuleBase {

return { signature, signatureDate, authorityAddress };
};

/**
*
* @param greenId
*/
burn = async (greenId: BigNumber): Promise<boolean> => {
try {
console.log(`Burning Green with ID '${greenId}'!`);

const {
estimateGas: { burn: estimateGas },
burn,
} = this.masa.contracts.instances.SoulboundGreenContract.connect(
this.masa.config.wallet
);

let gasLimit: BigNumber = await estimateGas(greenId);

if (this.masa.config.network?.gasSlippagePercentage) {
gasLimit = this.addSlippage(
gasLimit,
this.masa.config.network.gasSlippagePercentage
);
}
const { wait, hash } = await burn(greenId, {
gasLimit,
});

console.log(Messages.WaitingToFinalize(hash));
await wait();

console.log(`Burned Green with ID '${greenId}'!`);
return true;
} catch (error: unknown) {
if (error instanceof Error) {
console.error(`Burning Green Failed! '${error.message}'`);
}
}

return false;
};
}

0 comments on commit 0e432d2

Please sign in to comment.