diff --git a/action/index.cjs b/action/index.cjs index 7f45025..cfcbbf7 100644 --- a/action/index.cjs +++ b/action/index.cjs @@ -188028,6 +188028,11 @@ 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); @@ -188038,6 +188043,19 @@ const robot = (app) => { } return [...new Set(allOwners)]; } + async function isProviderAlreadyBranded(apiUrl, identity, provider) { + 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, + }; + } async function getAccountOwner(account) { const accountOwner = account; if (new out_1.Address(accountOwner).isContractAddress()) { @@ -188065,11 +188083,27 @@ const robot = (app) => { 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; + try { + const tokenOwnerResponse = await axios_1.default.get(`${apiUrl}/tokens/${token}?extract=owner`); + if (tokenOwnerResponse && tokenOwnerResponse.data) { + return tokenOwnerResponse.data; + } + return ''; + } + catch (error) { + console.log(`Cannot find token owner on the 'tokens' endpoint. Will try the 'collections'`); + } + try { + const tokenOwnerResponse = await axios_1.default.get(`${apiUrl}/collections/${token}?extract=owner`); + if (tokenOwnerResponse && tokenOwnerResponse.data) { + return tokenOwnerResponse.data; + } + return ''; + } + catch (error) { + await fail(`Cannot find token or collection with ID ${token}: ${error}`); + return ''; } - return ''; } function getApiUrl() { switch (network) { diff --git a/src/bot.ts b/src/bot.ts index 51d5124..7f6b456 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -66,6 +66,11 @@ 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); @@ -77,6 +82,25 @@ export const robot = (app: Probot) => { return [...new Set(allOwners)]; } + async function isProviderAlreadyBranded(apiUrl: string, identity: string, provider: string): Promise<{ + existing: boolean, + isUpdate?: boolean + }> { + 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, + }; + } + async function getAccountOwner(account: string): Promise { const accountOwner = account; if (new Address(accountOwner).isContractAddress()) { @@ -111,12 +135,28 @@ export const robot = (app: Probot) => { } async function getTokenOwnerFromApi(token: string, apiUrl: string): Promise { - const tokenOwnerResponse = await axios.get(`${apiUrl}/tokens/${token}?extract=owner`); - if (tokenOwnerResponse && tokenOwnerResponse.data) { - return tokenOwnerResponse.data; + try { + const tokenOwnerResponse = await axios.get(`${apiUrl}/tokens/${token}?extract=owner`); + if (tokenOwnerResponse && tokenOwnerResponse.data) { + return tokenOwnerResponse.data; + } + + return ''; + } catch (error) { + console.log(`Cannot find token owner on the 'tokens' endpoint. Will try the 'collections'`); } - return ''; + try { + const tokenOwnerResponse = await axios.get(`${apiUrl}/collections/${token}?extract=owner`); + if (tokenOwnerResponse && tokenOwnerResponse.data) { + return tokenOwnerResponse.data; + } + + return ''; + } catch (error) { + await fail(`Cannot find token or collection with ID ${token}: ${error}`); + return ''; + } } function getApiUrl() {