Skip to content

Commit 50b9dfd

Browse files
authored
fix: add base uri (#151)
* feat: add setBaseURI * test: add tests for baseURI
1 parent ab1a5d1 commit 50b9dfd

File tree

3 files changed

+121
-0
lines changed

3 files changed

+121
-0
lines changed

contracts/base/TradeTrustTokenBase.sol

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import "./TradeTrustTokenBurnable.sol";
66
import "./TradeTrustTokenMintable.sol";
77
import "./TradeTrustTokenRestorable.sol";
88
import "../interfaces/ITradeTrustToken.sol";
9+
import "./TradeTrustTokenBaseURI.sol";
910

1011
abstract contract TradeTrustTokenBase is
1112
TradeTrustSBT,
1213
RegistryAccess,
14+
TradeTrustTokenBaseURI,
1315
TradeTrustTokenBurnable,
1416
TradeTrustTokenMintable,
1517
TradeTrustTokenRestorable
@@ -30,6 +32,7 @@ abstract contract TradeTrustTokenBase is
3032
override(
3133
TradeTrustSBT,
3234
RegistryAccess,
35+
TradeTrustTokenBaseURI,
3336
TradeTrustTokenRestorable,
3437
TradeTrustTokenMintable,
3538
TradeTrustTokenBurnable
@@ -59,4 +62,8 @@ abstract contract TradeTrustTokenBase is
5962
revert TransferFailure();
6063
}
6164
}
65+
66+
function _baseURI() internal view virtual override(SBTUpgradeable, TradeTrustTokenBaseURI) returns (string memory) {
67+
return super._baseURI();
68+
}
6269
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// SPDX-License-Identifier: Apache-2.0
2+
pragma solidity ^0.8.0;
3+
4+
import "./TradeTrustSBT.sol";
5+
import "./RegistryAccess.sol";
6+
7+
abstract contract TradeTrustTokenBaseURI is TradeTrustSBT, RegistryAccess {
8+
string private _baseStorageURI;
9+
10+
function supportsInterface(bytes4 interfaceId)
11+
public
12+
view
13+
virtual
14+
override(TradeTrustSBT, RegistryAccess)
15+
returns (bool)
16+
{
17+
return super.supportsInterface(interfaceId);
18+
}
19+
20+
function setBaseURI(string memory baseURI) external onlyRole(DEFAULT_ADMIN_ROLE) {
21+
_setBaseURI(baseURI);
22+
}
23+
24+
function _setBaseURI(string memory baseURI) internal virtual {
25+
_baseStorageURI = baseURI;
26+
}
27+
28+
function _baseURI() internal view virtual override returns (string memory) {
29+
return _baseStorageURI;
30+
}
31+
}

test/TradeTrustTokenBaseURI.test.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { loadFixture } from "@nomicfoundation/hardhat-network-helpers";
2+
import { TradeTrustToken } from "@tradetrust/contracts";
3+
import faker from "faker";
4+
import { expect } from ".";
5+
import { getTestUsers, TestUsers, createDeployFixtureRunner, toAccessControlRevertMessage } from "./helpers";
6+
import { deployTokenFixture, DeployTokenFixtureRunner } from "./fixtures";
7+
import { roleHash } from "../src/constants";
8+
9+
describe("TradeTrustTokenBaseURI", async () => {
10+
let users: TestUsers;
11+
let registryContract: TradeTrustToken;
12+
13+
let registryName: string;
14+
let registrySymbol: string;
15+
16+
let registryContractAsAdmin: TradeTrustToken;
17+
18+
let fakeBaseURI: string;
19+
20+
let deployTokenFixtureRunner: DeployTokenFixtureRunner;
21+
22+
// eslint-disable-next-line no-undef
23+
before(async () => {
24+
users = await getTestUsers();
25+
26+
registryName = "The Great Shipping Company";
27+
registrySymbol = "GSC";
28+
29+
deployTokenFixtureRunner = async () =>
30+
createDeployFixtureRunner(
31+
...(await deployTokenFixture<TradeTrustToken>({
32+
tokenContractName: "TradeTrustToken",
33+
tokenName: registryName,
34+
tokenInitials: registrySymbol,
35+
deployer: users.carrier,
36+
}))
37+
);
38+
});
39+
40+
beforeEach(async () => {
41+
fakeBaseURI = `${faker.internet.url()}/`;
42+
43+
[, registryContract] = await loadFixture(deployTokenFixtureRunner);
44+
45+
registryContractAsAdmin = registryContract.connect(users.carrier);
46+
});
47+
48+
it("should revert set base URI when caller has no admin role", async () => {
49+
const nonAdminSigner = users.beneficiary;
50+
const tx = registryContract.connect(nonAdminSigner).setBaseURI(fakeBaseURI);
51+
52+
await expect(tx).to.be.revertedWith(toAccessControlRevertMessage(nonAdminSigner.address, roleHash.DefaultAdmin));
53+
});
54+
55+
it("should set base URI when caller has admin role", async () => {
56+
const tx = registryContractAsAdmin.setBaseURI(fakeBaseURI);
57+
58+
await expect(tx).to.not.be.reverted;
59+
});
60+
61+
describe("Behaviours of tokenURI and baseURI", () => {
62+
let tokenId: number;
63+
64+
beforeEach(async () => {
65+
tokenId = faker.datatype.number();
66+
await registryContractAsAdmin.mint(users.beneficiary.address, users.beneficiary.address, tokenId);
67+
});
68+
69+
it("should return the correct tokenURI when baseURI is set", async () => {
70+
await registryContractAsAdmin.setBaseURI(fakeBaseURI);
71+
72+
const tokenURI = await registryContract.tokenURI(tokenId);
73+
74+
expect(tokenURI).to.equal(`${fakeBaseURI}${tokenId}`);
75+
});
76+
77+
it("should return empty string as tokenURI when baseURI is not set", async () => {
78+
const tokenURI = await registryContract.tokenURI(tokenId);
79+
80+
expect(tokenURI).to.be.empty;
81+
});
82+
});
83+
});

0 commit comments

Comments
 (0)