Skip to content

Commit

Permalink
Merge pull request #6 from multiversx/extend-checks
Browse files Browse the repository at this point in the history
check collection owner and already branded identity
  • Loading branch information
bogdan-rosianu authored Mar 8, 2024
2 parents 771c4e7 + 5e9ee38 commit 92252a0
Show file tree
Hide file tree
Showing 2 changed files with 95 additions and 28 deletions.
58 changes: 45 additions & 13 deletions action/index.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -188028,16 +188028,42 @@ const robot = (app) => {
const allOwnersToCheck = [mainOwner, ...extraOwners];
const apiUrl = getApiUrl();
for (const owner of allOwnersToCheck) {
const alreadyExistingBranding = await isProviderAlreadyBranded(apiUrl, asset, owner);
if (alreadyExistingBranding && alreadyExistingBranding.existing && !alreadyExistingBranding.isUpdate) {
await fail(`${owner} is already branded. Only updates are allowed.`);
return [];
}
if (new out_1.Address(owner).isContractAddress()) {
const ownerResult = await axios_1.default.get(`${apiUrl}/accounts/${owner}?extract=ownerAddress`);
allOwners.push(ownerResult.data);
const ownerResult = await fetchStringValueFromApi(apiUrl, "accounts", owner, "ownerAddress");
if (ownerResult) {
allOwners.push(ownerResult);
}
}
else {
allOwners.push(owner);
}
}
return [...new Set(allOwners)];
}
async function isProviderAlreadyBranded(apiUrl, identity, provider) {
try {
const providerInfo = await axios_1.default.get(`${apiUrl}/providers/${provider}`);
if (!providerInfo) {
return { existing: false };
}
if (!providerInfo.data?.identity) {
return { existing: false };
}
return {
existing: true,
isUpdate: identity === providerInfo.data?.identity,
};
}
catch (error) {
console.error(`API error while fetching the provider data for address ${provider}: ${error}`);
return { existing: false };
}
}
async function getAccountOwner(account) {
const accountOwner = account;
if (new out_1.Address(accountOwner).isContractAddress()) {
Expand All @@ -188047,29 +188073,35 @@ const robot = (app) => {
}
async function getAccountOwnerFromApi(address) {
const apiUrl = getApiUrl();
const accountOwnerResponse = await axios_1.default.get(`${apiUrl}/accounts/${address}?extract=ownerAddress`);
if (accountOwnerResponse && accountOwnerResponse.data) {
return accountOwnerResponse.data;
}
return '';
return await fetchStringValueFromApi(apiUrl, "accounts", address, "ownerAddress");
}
async function getTokenOwner(token) {
// since the token owner can be changed at protocol level at any time, it's enough to check the ownership of the token,
// without checking any previous owners
const apiUrl = getApiUrl();
const tokenOwner = await getTokenOwnerFromApi(token, apiUrl);
if (new out_1.Address(tokenOwner).isContractAddress()) {
const ownerResult = await axios_1.default.get(`${apiUrl}/accounts/${tokenOwner}?extract=ownerAddress`);
return ownerResult.data;
return await fetchStringValueFromApi(apiUrl, "accounts", tokenOwner, "ownerAddress");
}
return tokenOwner;
}
async function getTokenOwnerFromApi(token, apiUrl) {
const tokenOwnerResponse = await axios_1.default.get(`${apiUrl}/tokens/${token}?extract=owner`);
if (tokenOwnerResponse && tokenOwnerResponse.data) {
return tokenOwnerResponse.data;
return await fetchStringValueFromApi(apiUrl, "tokens", token, "owner") ||
await fetchStringValueFromApi(apiUrl, "collections", token, "owner");
}
async function fetchStringValueFromApi(apiUrl, endpoint, query, extract) {
let requestUrl = `${apiUrl}/${endpoint}/${query}`;
if (extract) {
requestUrl += `?extract=${extract}`;
}
try {
const response = await axios_1.default.get(requestUrl);
return response.data;
}
catch (error) {
console.error(`Cannot query API at ${requestUrl}: ${error}`);
return '';
}
return '';
}
function getApiUrl() {
switch (network) {
Expand Down
65 changes: 50 additions & 15 deletions src/bot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,16 @@ export const robot = (app: Probot) => {
const apiUrl = getApiUrl();

for (const owner of allOwnersToCheck) {
const alreadyExistingBranding = await isProviderAlreadyBranded(apiUrl, asset as string, owner);
if (alreadyExistingBranding && alreadyExistingBranding.existing && !alreadyExistingBranding.isUpdate) {
await fail(`${owner} is already branded. Only updates are allowed.`);
return [];
}
if (new Address(owner).isContractAddress()) {
const ownerResult = await axios.get(`${apiUrl}/accounts/${owner}?extract=ownerAddress`);
allOwners.push(ownerResult.data);
const ownerResult = await fetchStringValueFromApi(apiUrl, "accounts", owner, "ownerAddress");
if (ownerResult) {
allOwners.push(ownerResult);
}
} else {
allOwners.push(owner);
}
Expand All @@ -77,6 +84,30 @@ export const robot = (app: Probot) => {
return [...new Set(allOwners)];
}

async function isProviderAlreadyBranded(apiUrl: string, identity: string, provider: string): Promise<{
existing: boolean,
isUpdate?: boolean
}> {
try {
const providerInfo = await axios.get(`${apiUrl}/providers/${provider}`);
if (!providerInfo) {
return { existing: false };
}

if (!providerInfo.data?.identity) {
return { existing: false };
}

return {
existing: true,
isUpdate: identity === providerInfo.data?.identity,
};
} catch (error) {
console.error(`API error while fetching the provider data for address ${provider}: ${error}`);
return { existing: false };
}
}

async function getAccountOwner(account: string): Promise<string> {
const accountOwner = account;
if (new Address(accountOwner).isContractAddress()) {
Expand All @@ -88,12 +119,7 @@ export const robot = (app: Probot) => {

async function getAccountOwnerFromApi(address: string): Promise<string> {
const apiUrl = getApiUrl();
const accountOwnerResponse = await axios.get(`${apiUrl}/accounts/${address}?extract=ownerAddress`);
if (accountOwnerResponse && accountOwnerResponse.data) {
return accountOwnerResponse.data;
}

return '';
return await fetchStringValueFromApi(apiUrl, "accounts", address, "ownerAddress");
}

async function getTokenOwner(token: string): Promise<string> {
Expand All @@ -103,20 +129,29 @@ export const robot = (app: Probot) => {

const tokenOwner = await getTokenOwnerFromApi(token, apiUrl);
if (new Address(tokenOwner).isContractAddress()) {
const ownerResult = await axios.get(`${apiUrl}/accounts/${tokenOwner}?extract=ownerAddress`);
return ownerResult.data;
return await fetchStringValueFromApi(apiUrl, "accounts", tokenOwner, "ownerAddress");
}

return tokenOwner;
}

async function getTokenOwnerFromApi(token: string, apiUrl: string): Promise<string> {
const tokenOwnerResponse = await axios.get(`${apiUrl}/tokens/${token}?extract=owner`);
if (tokenOwnerResponse && tokenOwnerResponse.data) {
return tokenOwnerResponse.data;
}
return await fetchStringValueFromApi(apiUrl, "tokens", token, "owner") ||
await fetchStringValueFromApi(apiUrl, "collections", token, "owner");
}

return '';
async function fetchStringValueFromApi(apiUrl: string, endpoint: string, query: string, extract?: string): Promise<string> {
let requestUrl = `${apiUrl}/${endpoint}/${query}`;
if (extract) {
requestUrl += `?extract=${extract}`;
}
try {
const response = await axios.get(requestUrl);
return response.data;
} catch (error) {
console.error(`Cannot query API at ${requestUrl}: ${error}`);
return '';
}
}

function getApiUrl() {
Expand Down

0 comments on commit 92252a0

Please sign in to comment.