Skip to content

Commit

Permalink
[Issue-3191] Support Avail OG Mainnet
Browse files Browse the repository at this point in the history
  • Loading branch information
bluezdot committed Jul 24, 2024
1 parent 2524124 commit 5025dcd
Show file tree
Hide file tree
Showing 7 changed files with 184 additions and 93 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@
"@polkadot/types-support": "^12.0.2",
"@polkadot/util": "^12.6.2",
"@polkadot/util-crypto": "^12.6.2",
"@subwallet/chain-list": "0.2.77",
"@subwallet/chain-list": "0.2.78-beta.0",
"@subwallet/keyring": "^0.1.5",
"@subwallet/react-ui": "5.1.2-b79",
"@subwallet/ui-keyring": "^0.1.5",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
// SPDX-License-Identifier: Apache-2.0

export const COLLECT_ID = 'Avail OG';
export const ALC_NFT_RAW_VALUE = {
BRONZE: '{"p":"OIS-AVAIL","op":"create","tick":"AVAIL-OG","imgUrl":"https://storage.googleapis.com/blobscriptions.appspot.com/user-uploads%2Fclyy54fsc0001jpr1bi3thgp7%2F1721723052313-mkyf6c7hkfv9v0mgu0itbof7-bronzeNFT.mp4","tokenType":"NFT","totalSupply":"5000","limit":"5000","traits":{"Tier":"bronze"},"name":"Bronze OG"}',
SILVER: '{"p":"OIS-AVAIL","op":"create","tick":"AVAIL-OG","imgUrl":"https://storage.googleapis.com/blobscriptions.appspot.com/user-uploads%2Fclyy54fsc0001jpr1bi3thgp7%2F1721722886703-hnhan3yc1ma9v8euheq8aj21-silverNFT.mp4","tokenType":"NFT","totalSupply":"4000","limit":"4000","traits":{"Tier":"silver"},"name":"Silver OG"}',
GOLD: '{"p":"OIS-AVAIL","op":"create","tick":"AVAIL-OG","imgUrl":"https://storage.googleapis.com/blobscriptions.appspot.com/user-uploads%2Fclyy54fsc0001jpr1bi3thgp7%2F1721722632268-mdwdbwp1yv58iuyl4zzzr3t8-goldNFT.mp4","tokenType":"NFT","totalSupply":"1000","limit":"1000","traits":{"Tier":"gold"},"name":"Gold OG"}'
};
190 changes: 104 additions & 86 deletions packages/extension-base/src/koni/api/nft/blobinscription/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,49 +2,75 @@
// SPDX-License-Identifier: Apache-2.0

import { NftCollection, NftItem } from '@subwallet/extension-base/background/KoniTypes';
import { COLLECT_ID } from '@subwallet/extension-base/koni/api/nft/blobinscription/consts';
import { ALC, getNftDetail, NftResponse, RemarkData, transferPayload } from '@subwallet/extension-base/koni/api/nft/blobinscription/types';
import { AVAIL_LIGHT_CLIENT_NFT } from '@subwallet/extension-base/koni/api/nft/config';
import { BaseNftApi, HandleNftParams } from '@subwallet/extension-base/koni/api/nft/nft';

interface NftResponse {
data: {
dataAvailabilities: NftData[]
import { hexToString } from '@polkadot/util';

export class BlobInscriptionApi extends BaseNftApi {
endpoint = AVAIL_LIGHT_CLIENT_NFT;

constructor (chain: string, addresses: string[]) {
super(chain, undefined, addresses);
}
}

const COLLECT_ID = 'ALC_NFT';
// Get all NFTs //

interface NftData {
isJson: boolean,
id: string,
extrinsicHash: string,
dataValue: string,
dataRaw: string,
sender: {
address: string
private static parseNftRequestRemark () {
return {
query: `
query MyQuery {
remarks(where: {sender: {address_eq: "5CvsA5aWiDLfnxg7fdyvXzPx6tdrNp2rcqigTMKCSEZTHaWn"}}, limit: 9000) {
dataRaw
}
}
`
};
}
}

interface ALC { // need confirm
p: string,
op: string,
tick: string,
imgUrl: string,
name: string,
traits: Record<string, any>
}
private async getAllInscriptions () {
const response = await fetch(this.endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(BlobInscriptionApi.parseNftRequestRemark())
});

export class BlobInscriptionApi extends BaseNftApi {
endpoint = AVAIL_LIGHT_CLIENT_NFT;
const result = await response.json() as RemarkData;

constructor (chain: string, addresses: string[]) {
super(chain, undefined, addresses);
return result.data.remarks;
}

private async getNftMap () {
const nftMap: Record<string, string[]> = {};
const rawList = await this.getAllInscriptions();

rawList.forEach((item) => {
const jsonData = JSON.parse(hexToString(item.dataRaw)) as transferPayload;

if (nftMap[jsonData.to]) {
nftMap[jsonData.to].push(jsonData.tick);
}

nftMap[jsonData.to] = [jsonData.tick];
});

return nftMap;
}

// Get all NFTs //

// Deprecated: Old get NFTs balance //

private static parseNftRequest (address: string, isJson = true) {
// noted: check to handle isJson
return {
query: `
query MyQuery {
dataAvailabilities(where: {sender: {address_eq: "${address}"}, isJson_eq: ${isJson}}) {
dataAvailabilities(where: {sender: {address_eq: "${address}"}, isJson_eq: ${isJson.toString()}}) {
id
extrinsicHash
dataRaw
Expand All @@ -59,6 +85,21 @@ export class BlobInscriptionApi extends BaseNftApi {
};
}

// @ts-ignore
private async getBalances (address: string) {
const response = await fetch(this.endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(BlobInscriptionApi.parseNftRequest(address))
});

const result = await response.json() as NftResponse;

return result?.data?.dataAvailabilities;
}

private handleProperties (data: ALC) {
const propertiesMap: Record<string, any> = {};
const attRecord = data.traits;
Expand All @@ -75,70 +116,47 @@ export class BlobInscriptionApi extends BaseNftApi {
return propertiesMap;
}

private async getBalances (address: string) {
const response = await fetch(this.endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(BlobInscriptionApi.parseNftRequest(address))
});

const result = await response.json() as NftResponse;

return result?.data?.dataAvailabilities;
}

public async handleNfts (params: HandleNftParams) {
const allInscriptionsMap = await this.getNftMap();

try {
await Promise.all(this.addresses.map(async (address) => {
const balances = await this.getBalances(address);
// eslint-disable-next-line array-callback-return
await Promise.all(this.addresses.map((address) => {
const nfts = allInscriptionsMap[address];

if (balances.length > 0) {
if (nfts) {
const collectionMap: Record <string, NftCollection> = {};

for (const nft of balances) {
try {
if (nft.isJson) {
const _data = JSON.parse(nft.dataValue) as ALC | number;

if (_data === Infinity) { // check truly json
continue;
}

const data = _data as ALC;

if (data.op === 'create_collection') { // skip extrinsic creat collection
continue;
}

const propertiesMap = this.handleProperties(data);

const parsedNft: NftItem = {
id: nft.id, // is distinct?
chain: this.chain,
owner: address, // is submitter = owner? '5Hawkn8oUeSTB3LesTh5nGjfnpor2ZWBArdQ64d6BxgD5Pgm'
name: data.tick,
image: data.imgUrl, // recheck
collectionId: COLLECT_ID,
properties: propertiesMap
};

params.updateItem(this.chain, parsedNft, address); // '5Hawkn8oUeSTB3LesTh5nGjfnpor2ZWBArdQ64d6BxgD5Pgm'

if (!collectionMap[COLLECT_ID]) {
const parsedCollection: NftCollection = {
collectionId: COLLECT_ID,
chain: this.chain,
collectionName: COLLECT_ID
};

collectionMap[COLLECT_ID] = parsedCollection;
params.updateCollection(this.chain, parsedCollection);
}
}
} catch (e) {
console.error(`Failed to fetch blob inscription ${nft.dataValue}`, e);
for (const nft of nfts) {
const nftDetail = getNftDetail(nft);

if (!nftDetail) {
continue;
}

const propertiesMap = this.handleProperties(nftDetail);

const parsedNft: NftItem = {
id: address, // is distinct?
chain: this.chain,
owner: address,
name: nftDetail.name,
image: nftDetail.imgUrl,
collectionId: COLLECT_ID,
properties: propertiesMap
};

params.updateItem(this.chain, parsedNft, address);

if (!collectionMap[COLLECT_ID]) {
const parsedCollection: NftCollection = {
collectionId: COLLECT_ID,
chain: this.chain,
collectionName: COLLECT_ID
};

collectionMap[COLLECT_ID] = parsedCollection;
params.updateCollection(this.chain, parsedCollection);
}
}
}
Expand Down
60 changes: 60 additions & 0 deletions packages/extension-base/src/koni/api/nft/blobinscription/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
// SPDX-License-Identifier: Apache-2.0

import { ALC_NFT_RAW_VALUE } from '@subwallet/extension-base/koni/api/nft/blobinscription/consts';

export interface NftResponse {
data: {
dataAvailabilities: NftData[]
}
}

interface NftData {
isJson: boolean,
id: string,
extrinsicHash: string,
dataValue: string,
dataRaw: string,
sender: {
address: string
}
}

export interface ALC { // need confirm
p: string,
op: string,
tick: string,
imgUrl: string,
name: string,
traits: Record<string, any>
}

export interface RemarkData {
data: {
remarks: { dataRaw: string }[]
}
}

export interface transferPayload {
p: string,
op: string,
amount: string,
tick: string,
to: string
}

export function getNftDetail (nftSlug: string) {
if (nftSlug === 'AVAIL-OG-sqsu5a91qbu0s4oj3ldg8lrf') { // Gold
return JSON.parse(ALC_NFT_RAW_VALUE.GOLD) as ALC;
}

if (nftSlug === 'AVAIL-OG-zdttjyidincrjgsmwqbxoghz') { // Silver
return JSON.parse(ALC_NFT_RAW_VALUE.SILVER) as ALC;
}

if (nftSlug === 'AVAIL-OG-zy0n66yqtgw6z139hnf5vdxb') { // Bronze
return JSON.parse(ALC_NFT_RAW_VALUE.BRONZE) as ALC;
}

return undefined;
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,5 +108,7 @@ export default function nftParamsHandler (nftItem: NftItem, chain: string) {
}
}

return {};
return {
networkKey: nftItem.chain
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -108,5 +108,7 @@ export default function nftParamsHandler (nftItem: NftItem, chain: string) {
}
}

return {};
return {
networkKey: nftItem.chain
};
}
8 changes: 4 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -6050,14 +6050,14 @@ __metadata:
languageName: node
linkType: hard

"@subwallet/chain-list@npm:0.2.77":
version: 0.2.77
resolution: "@subwallet/chain-list@npm:0.2.77"
"@subwallet/chain-list@npm:0.2.78-beta.0":
version: 0.2.78-beta.0
resolution: "@subwallet/chain-list@npm:0.2.78-beta.0"
dependencies:
"@polkadot/dev": 0.67.167
"@polkadot/util": ^12.5.1
eventemitter3: ^5.0.1
checksum: b1d8bd3a0ba6ad697365384d641fa35c93da073b278848a7685c2398f16502b2bab6fb3f87bbe966cab21db107d08b39325c6d582d0075908aa177688f3d8b23
checksum: 92e38aa534274ae098dc9ca9111cd76858f19ed23f0f97179481e7750652cad254bb55a556781b4e9e92338b7715242864e45505e358cde45b4dca0ed804b970
languageName: node
linkType: hard

Expand Down

0 comments on commit 5025dcd

Please sign in to comment.