From 67e776be95c6c96be77d36eb6ce9282ae7b1bcca Mon Sep 17 00:00:00 2001 From: Antoine Estienne Date: Tue, 4 Nov 2025 10:32:51 +0100 Subject: [PATCH 1/7] separate activity token and resolver --- the-guild-smart-contracts/README.md | 24 +++++---- .../script/FullDeploymentScript.s.sol | 21 ++++++-- .../script/TheGuildActivityToken.s.sol | 8 ++- .../src/TheGuildActivityToken.sol | 52 ++----------------- .../src/TheGuildAttestationResolver.sol | 49 +++++++++++++++++ .../test/TheGuildActivityToken.t.sol | 3 +- 6 files changed, 89 insertions(+), 68 deletions(-) create mode 100644 the-guild-smart-contracts/src/TheGuildAttestationResolver.sol diff --git a/the-guild-smart-contracts/README.md b/the-guild-smart-contracts/README.md index f67039c..20f0aab 100644 --- a/the-guild-smart-contracts/README.md +++ b/the-guild-smart-contracts/README.md @@ -126,28 +126,30 @@ export CREATE2_SALT=123456 forge script script/TheGuildBadgeRegistry.s.sol:TheGuildBadgeRegistryScript --rpc-url --private-key --broadcast ``` -### Tokens +### Tokens & Resolver -- `TheGuildActivityToken` (symbol `TGA`) is an ERC20 with standard 18 decimals. The deployer is the owner and can mint. See `src/TheGuildActivityToken.sol`. -- The token also acts as an EAS Resolver: it inherits `SchemaResolver` and mints 10 TGA to the attester address on each successful attestation. +- `TheGuildActivityToken` (symbol `TGA`) is a plain ERC20 with standard 18 decimals. The deployer is the initial owner and can mint. See `src/TheGuildActivityToken.sol`. +- `TheGuildAttestationResolver` is an EAS `SchemaResolver` that mints TGA to the attester on successful attestations. It takes the global `IEAS` and the deployed `TheGuildActivityToken` in its constructor. See `src/TheGuildAttestationResolver.sol`. -#### EAS Resolver behavior (TheGuildActivityToken) +#### EAS Resolver behavior (TheGuildAttestationResolver) - Inherits `SchemaResolver` and implements: - `onAttest(attestation, value)`: mints `10 * 10^decimals()` to `attestation.attester` and returns `true`. - `onRevoke(...)`: no-op, returns `true`. -- Constructor requires the global `IEAS` address. Deployment script `script/TheGuildActivityToken.s.sol` auto-selects the EAS address by `chainid` (Base/Optimism/Arbitrum/Polygon, plus testnets) or falls back to `EAS_ADDRESS` env var. -- To use it as a resolver, set this contract address as the `resolver` when registering your EAS Schema. When EAS processes an attestation for that schema, it will call `attest()` on the resolver, which delegates to `onAttest`. -- Learn more about EAS resolvers in the official docs: [Resolver Contracts](https://docs.attest.org/docs/core--concepts/resolver-contracts). +- Deployment wiring: + - Deploy `TheGuildActivityToken`. + - Deploy `TheGuildAttestationResolver` with `(IEAS, token)`. + - Transfer ownership of the token to the resolver so it can mint: `token.transferOwnership(resolver)`. +- Register your EAS Schema with `resolver` set to the resolver address (not the token!). When EAS processes an attestation for that schema, it will call the resolver which mints tokens. +- Learn more about EAS resolvers: [Resolver Contracts](https://docs.attest.org/docs/core--concepts/resolver-contracts). Quick steps: -1. Deploy TGA (resolver): - - Uses `IEAS` in constructor; see the deploy script for per-chain EAS addresses. -2. Register your schema in EAS with `resolver` set to the deployed TGA address. +1. Deploy TGA and the resolver, then transfer token ownership to the resolver. +2. Register your schema in EAS with `resolver` set to the resolver address. 3. Create attestations against that schema. Each attestation mints 10 TGA to the attester automatically. -Deploy: +Deploy (example): ```shell forge script script/TheGuildActivityToken.s.sol:TheGuildActivityTokenScript \ diff --git a/the-guild-smart-contracts/script/FullDeploymentScript.s.sol b/the-guild-smart-contracts/script/FullDeploymentScript.s.sol index 6972c02..555e787 100644 --- a/the-guild-smart-contracts/script/FullDeploymentScript.s.sol +++ b/the-guild-smart-contracts/script/FullDeploymentScript.s.sol @@ -6,6 +6,7 @@ import {EAS} from "eas-contracts/EAS.sol"; import {AttestationRequestData, AttestationRequest} from "eas-contracts/IEAS.sol"; import {SchemaRegistry} from "eas-contracts/SchemaRegistry.sol"; import {TheGuildActivityToken} from "../src/TheGuildActivityToken.sol"; +import {TheGuildAttestationResolver} from "../src/TheGuildAttestationResolver.sol"; import {TheGuildBadgeRegistry} from "../src/TheGuildBadgeRegistry.sol"; import {TheGuildBadgeRanking} from "../src/TheGuildBadgeRanking.sol"; import {EASUtils} from "./utils/EASUtils.s.sol"; @@ -23,20 +24,28 @@ contract FullDeploymentScript is Script { vm.startBroadcast(); - // Deploy or attach to existing activity token via CREATE2 - TheGuildActivityToken activityToken = new TheGuildActivityToken{salt: salt}(eas); + // Deploy activity token and resolver via CREATE2 + TheGuildActivityToken activityToken = new TheGuildActivityToken{ + salt: salt + }(); + TheGuildAttestationResolver resolver = new TheGuildAttestationResolver{ + salt: salt + }(eas, activityToken); + activityToken.transferOwnership(address(resolver)); // Register TheGuild Schema string memory schema = "bytes32 badgeName, bytes justification"; SchemaRegistry schemaRegistry = SchemaRegistry( EASUtils.getSchemaRegistryAddress(vm) ); - bytes32 schemaId = schemaRegistry.register(schema, activityToken, true); + bytes32 schemaId = schemaRegistry.register(schema, resolver, true); console.logString("Schema ID:"); console.logBytes32(schemaId); // Deploy or attach to existing badge registry via CREATE2 - TheGuildBadgeRegistry badgeRegistry = new TheGuildBadgeRegistry{salt: salt}(); + TheGuildBadgeRegistry badgeRegistry = new TheGuildBadgeRegistry{ + salt: salt + }(); // Create some badges badgeRegistry.createBadge( @@ -53,7 +62,9 @@ contract FullDeploymentScript is Script { ); // Deploy or attach to existing badge ranking via CREATE2 - TheGuildBadgeRanking badgeRanking = new TheGuildBadgeRanking{salt: salt}(badgeRegistry); + TheGuildBadgeRanking badgeRanking = new TheGuildBadgeRanking{ + salt: salt + }(badgeRegistry); // Create some attestations AttestationRequestData memory data = AttestationRequestData({ diff --git a/the-guild-smart-contracts/script/TheGuildActivityToken.s.sol b/the-guild-smart-contracts/script/TheGuildActivityToken.s.sol index 2e0a836..a69ea5a 100644 --- a/the-guild-smart-contracts/script/TheGuildActivityToken.s.sol +++ b/the-guild-smart-contracts/script/TheGuildActivityToken.s.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.13; import {Script} from "forge-std/Script.sol"; import {IEAS} from "eas-contracts/IEAS.sol"; import {TheGuildActivityToken} from "../src/TheGuildActivityToken.sol"; +import {TheGuildAttestationResolver} from "../src/TheGuildAttestationResolver.sol"; import {EASUtils} from "./utils/EASUtils.s.sol"; contract TheGuildActivityTokenScript is Script { @@ -16,7 +17,12 @@ contract TheGuildActivityTokenScript is Script { eas = EASUtils.getEASAddress(vm); vm.startBroadcast(); - new TheGuildActivityToken(IEAS(eas)); + TheGuildActivityToken token = new TheGuildActivityToken(); + TheGuildAttestationResolver resolver = new TheGuildAttestationResolver( + IEAS(eas), + token + ); + token.transferOwnership(address(resolver)); vm.stopBroadcast(); } } diff --git a/the-guild-smart-contracts/src/TheGuildActivityToken.sol b/the-guild-smart-contracts/src/TheGuildActivityToken.sol index 783b93f..7997df0 100644 --- a/the-guild-smart-contracts/src/TheGuildActivityToken.sol +++ b/the-guild-smart-contracts/src/TheGuildActivityToken.sol @@ -3,60 +3,14 @@ pragma solidity ^0.8.13; import {ERC20} from "openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; import {Ownable} from "openzeppelin-contracts/contracts/access/Ownable.sol"; -import {SchemaResolver} from "eas-contracts/resolver/SchemaResolver.sol"; -import {IEAS, Attestation} from "eas-contracts/IEAS.sol"; /// @title TheGuildActivityToken (TGA) -/// @notice ERC20 that also serves as an EAS schema resolver; mints on attest. -contract TheGuildActivityToken is ERC20, Ownable, SchemaResolver { - // enumerate attestation ids - bytes32[] private attestationIds; - - //IEAS private _eas; - - constructor( - IEAS eas - ) - ERC20("TheGuildActivityToken", "TGA") - Ownable(msg.sender) - SchemaResolver(eas) - {} +/// @notice Pure ERC20 token; ownership is transferred to resolver to mint on attest. +contract TheGuildActivityToken is ERC20, Ownable { + constructor() ERC20("TheGuildActivityToken", "TGA") Ownable(msg.sender) {} /// @notice Mint tokens to a recipient. Only owner can mint. function mint(address to, uint256 amount) external onlyOwner { _mint(to, amount); } - - /// @inheritdoc SchemaResolver - function onAttest( - Attestation calldata attestation, - uint256 - ) internal override returns (bool) { - _mint(attestation.attester, 10 * (10 ** decimals())); - // TODO: get rid of this when we have our graphQL setup - attestationIds.push(attestation.uid); - return true; - } - - /// @inheritdoc SchemaResolver - function onRevoke( - Attestation calldata, - uint256 - ) internal pure override returns (bool) { - return true; - } - - // TODO: get rid of this when we have our graphQL setup - - /// @notice Get attestation count - function getAttestationCount() external view returns (uint256) { - return attestationIds.length; - } - - /// @notice Get attestation id at a specific index - function getAttestationAtIndex( - uint256 index - ) external view returns (Attestation memory) { - return _eas.getAttestation(attestationIds[index]); - } } diff --git a/the-guild-smart-contracts/src/TheGuildAttestationResolver.sol b/the-guild-smart-contracts/src/TheGuildAttestationResolver.sol new file mode 100644 index 0000000..950c7c2 --- /dev/null +++ b/the-guild-smart-contracts/src/TheGuildAttestationResolver.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +import {SchemaResolver} from "eas-contracts/resolver/SchemaResolver.sol"; +import {IEAS, Attestation} from "eas-contracts/IEAS.sol"; +import {TheGuildActivityToken} from "./TheGuildActivityToken.sol"; + +/// @title TheGuildAttestationResolver +/// @notice EAS schema resolver that mints TGA tokens on attest. +contract TheGuildAttestationResolver is SchemaResolver { + TheGuildActivityToken private _token; + + // TODO: get rid of this when we have our graphQL setup + bytes32[] private _attestationIds; + + constructor(IEAS eas, TheGuildActivityToken token) SchemaResolver(eas) { + _token = token; + } + + /// @inheritdoc SchemaResolver + function onAttest( + Attestation calldata attestation, + uint256 + ) internal override returns (bool) { + _token.mint(attestation.attester, 10 * (10 ** _token.decimals())); + // TODO: get rid of this when we have our graphQL setup + _attestationIds.push(attestation.uid); + return true; + } + + /// @inheritdoc SchemaResolver + function onRevoke( + Attestation calldata, + uint256 + ) internal pure override returns (bool) { + return true; + } + + // TODO: get rid of this when we have our graphQL setup + function getAttestationCount() external view returns (uint256) { + return _attestationIds.length; + } + + function getAttestationAtIndex( + uint256 index + ) external view returns (Attestation memory) { + return _eas.getAttestation(_attestationIds[index]); + } +} diff --git a/the-guild-smart-contracts/test/TheGuildActivityToken.t.sol b/the-guild-smart-contracts/test/TheGuildActivityToken.t.sol index 9b67759..6476068 100644 --- a/the-guild-smart-contracts/test/TheGuildActivityToken.t.sol +++ b/the-guild-smart-contracts/test/TheGuildActivityToken.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.13; import {Test} from "forge-std/Test.sol"; -import {IEAS} from "eas-contracts/IEAS.sol"; import {TheGuildActivityToken} from "../src/TheGuildActivityToken.sol"; contract TheGuildActivityTokenTest is Test { @@ -12,7 +11,7 @@ contract TheGuildActivityTokenTest is Test { address private user = address(0xBEEF); function setUp() public { - token = new TheGuildActivityToken(IEAS(address(0x1))); + token = new TheGuildActivityToken(); } function test_Metadata() public view { From 40c23a965d1d08edebf3fd9dccb9dfca5869fc44 Mon Sep 17 00:00:00 2001 From: Antoine Estienne Date: Tue, 4 Nov 2025 10:44:35 +0100 Subject: [PATCH 2/7] take badge resgitry into rsolver constr and check that badges exist --- .../script/FullDeploymentScript.s.sol | 20 +-- ....sol => TheGuildAttestationResolver.s.sol} | 5 +- .../src/TheGuildAttestationResolver.sol | 14 +- .../test/TheGuildAttestationResolver.t.sol | 138 ++++++++++++++++++ 4 files changed, 165 insertions(+), 12 deletions(-) rename the-guild-smart-contracts/script/{TheGuildActivityToken.s.sol => TheGuildAttestationResolver.s.sol} (85%) create mode 100644 the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol diff --git a/the-guild-smart-contracts/script/FullDeploymentScript.s.sol b/the-guild-smart-contracts/script/FullDeploymentScript.s.sol index 555e787..1065d8a 100644 --- a/the-guild-smart-contracts/script/FullDeploymentScript.s.sol +++ b/the-guild-smart-contracts/script/FullDeploymentScript.s.sol @@ -24,13 +24,20 @@ contract FullDeploymentScript is Script { vm.startBroadcast(); - // Deploy activity token and resolver via CREATE2 + // Deploy activity token via CREATE2 TheGuildActivityToken activityToken = new TheGuildActivityToken{ salt: salt }(); + + // Deploy or attach to existing badge registry via CREATE2 (needs to exist before resolver) + TheGuildBadgeRegistry badgeRegistry = new TheGuildBadgeRegistry{ + salt: salt + }(); + + // Deploy resolver via CREATE2 TheGuildAttestationResolver resolver = new TheGuildAttestationResolver{ salt: salt - }(eas, activityToken); + }(eas, activityToken, badgeRegistry); activityToken.transferOwnership(address(resolver)); // Register TheGuild Schema @@ -42,11 +49,6 @@ contract FullDeploymentScript is Script { console.logString("Schema ID:"); console.logBytes32(schemaId); - // Deploy or attach to existing badge registry via CREATE2 - TheGuildBadgeRegistry badgeRegistry = new TheGuildBadgeRegistry{ - salt: salt - }(); - // Create some badges badgeRegistry.createBadge( bytes32("Rust"), @@ -62,9 +64,7 @@ contract FullDeploymentScript is Script { ); // Deploy or attach to existing badge ranking via CREATE2 - TheGuildBadgeRanking badgeRanking = new TheGuildBadgeRanking{ - salt: salt - }(badgeRegistry); + new TheGuildBadgeRanking{salt: salt}(badgeRegistry); // Create some attestations AttestationRequestData memory data = AttestationRequestData({ diff --git a/the-guild-smart-contracts/script/TheGuildActivityToken.s.sol b/the-guild-smart-contracts/script/TheGuildAttestationResolver.s.sol similarity index 85% rename from the-guild-smart-contracts/script/TheGuildActivityToken.s.sol rename to the-guild-smart-contracts/script/TheGuildAttestationResolver.s.sol index a69ea5a..4612b54 100644 --- a/the-guild-smart-contracts/script/TheGuildActivityToken.s.sol +++ b/the-guild-smart-contracts/script/TheGuildAttestationResolver.s.sol @@ -5,6 +5,7 @@ import {Script} from "forge-std/Script.sol"; import {IEAS} from "eas-contracts/IEAS.sol"; import {TheGuildActivityToken} from "../src/TheGuildActivityToken.sol"; import {TheGuildAttestationResolver} from "../src/TheGuildAttestationResolver.sol"; +import {TheGuildBadgeRegistry} from "../src/TheGuildBadgeRegistry.sol"; import {EASUtils} from "./utils/EASUtils.s.sol"; contract TheGuildActivityTokenScript is Script { @@ -18,9 +19,11 @@ contract TheGuildActivityTokenScript is Script { vm.startBroadcast(); TheGuildActivityToken token = new TheGuildActivityToken(); + TheGuildBadgeRegistry badgeRegistry = new TheGuildBadgeRegistry(); TheGuildAttestationResolver resolver = new TheGuildAttestationResolver( IEAS(eas), - token + token, + badgeRegistry ); token.transferOwnership(address(resolver)); vm.stopBroadcast(); diff --git a/the-guild-smart-contracts/src/TheGuildAttestationResolver.sol b/the-guild-smart-contracts/src/TheGuildAttestationResolver.sol index 950c7c2..6e02b10 100644 --- a/the-guild-smart-contracts/src/TheGuildAttestationResolver.sol +++ b/the-guild-smart-contracts/src/TheGuildAttestationResolver.sol @@ -4,17 +4,24 @@ pragma solidity ^0.8.13; import {SchemaResolver} from "eas-contracts/resolver/SchemaResolver.sol"; import {IEAS, Attestation} from "eas-contracts/IEAS.sol"; import {TheGuildActivityToken} from "./TheGuildActivityToken.sol"; +import {TheGuildBadgeRegistry} from "./TheGuildBadgeRegistry.sol"; /// @title TheGuildAttestationResolver /// @notice EAS schema resolver that mints TGA tokens on attest. contract TheGuildAttestationResolver is SchemaResolver { TheGuildActivityToken private _token; + TheGuildBadgeRegistry private _badgeRegistry; // TODO: get rid of this when we have our graphQL setup bytes32[] private _attestationIds; - constructor(IEAS eas, TheGuildActivityToken token) SchemaResolver(eas) { + constructor( + IEAS eas, + TheGuildActivityToken token, + TheGuildBadgeRegistry badgeRegistry + ) SchemaResolver(eas) { _token = token; + _badgeRegistry = badgeRegistry; } /// @inheritdoc SchemaResolver @@ -22,6 +29,11 @@ contract TheGuildAttestationResolver is SchemaResolver { Attestation calldata attestation, uint256 ) internal override returns (bool) { + (bytes32 badgeName, ) = abi.decode(attestation.data, (bytes32, bytes)); + if (!_badgeRegistry.exists(badgeName)) { + return false; + } + _token.mint(attestation.attester, 10 * (10 ** _token.decimals())); // TODO: get rid of this when we have our graphQL setup _attestationIds.push(attestation.uid); diff --git a/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol b/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol new file mode 100644 index 0000000..8b5f525 --- /dev/null +++ b/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +import {Test} from "forge-std/Test.sol"; +import {TheGuildActivityToken} from "../src/TheGuildActivityToken.sol"; +import {TheGuildAttestationResolver} from "../src/TheGuildAttestationResolver.sol"; +import {TheGuildBadgeRegistry} from "../src/TheGuildBadgeRegistry.sol"; + +// EAS contracts +import {EAS} from "eas-contracts/EAS.sol"; +import {SchemaRegistry} from "eas-contracts/SchemaRegistry.sol"; +import {IEAS, AttestationRequest, AttestationRequestData} from "eas-contracts/IEAS.sol"; + +contract TheGuildAttestationResolverTest is Test { + TheGuildActivityToken private token; + TheGuildAttestationResolver private resolver; + TheGuildBadgeRegistry private badgeRegistry; + SchemaRegistry private schemaRegistry; + EAS private eas; + + address private attester = address(0xA11CE); + address private recipient = address(0xBEEF); + + function setUp() public { + // Deploy EAS stack locally + schemaRegistry = new SchemaRegistry(); + eas = new EAS(schemaRegistry); + + // Deploy token, registry & resolver and transfer ownership to resolver + token = new TheGuildActivityToken(); + badgeRegistry = new TheGuildBadgeRegistry(); + resolver = new TheGuildAttestationResolver( + IEAS(address(eas)), + token, + badgeRegistry + ); + token.transferOwnership(address(resolver)); + } + + function _registerSchema() internal returns (bytes32) { + // Minimal schema aligned with README and scripts + string memory schema = "bytes32 badgeName, bytes justification"; + // Register with our resolver so attestations invoke onAttest + bytes32 schemaId = schemaRegistry.register(schema, resolver, true); + return schemaId; + } + + function test_AttestationMintsTokensToAttester() public { + bytes32 schemaId = _registerSchema(); + + // Ensure badge exists + badgeRegistry.createBadge( + bytes32("Rust"), + bytes32("Know how to code in Rust") + ); + + // Build attestation request + AttestationRequestData memory data = AttestationRequestData({ + recipient: recipient, + expirationTime: 0, + revocable: true, + refUID: bytes32(0), + data: abi.encode(bytes32("Rust"), bytes("Saw them coding in Rust")), + value: 0 + }); + + AttestationRequest memory request = AttestationRequest({ + schema: schemaId, + data: data + }); + + // Simulate attester calling EAS + vm.prank(attester); + eas.attest(request); + + // Resolver should mint 10 * 10^18 to attester + assertEq(token.balanceOf(attester), 10 * (10 ** token.decimals())); + } + + function test_AttestWithoutOwnershipTransferWouldFail() public { + // Fresh token not owned by resolver + TheGuildActivityToken tempToken = new TheGuildActivityToken(); + TheGuildBadgeRegistry tempRegistry = new TheGuildBadgeRegistry(); + TheGuildAttestationResolver tempResolver = new TheGuildAttestationResolver( + IEAS(address(eas)), + tempToken, + tempRegistry + ); + + bytes32 schemaId = schemaRegistry.register( + "bytes32 badgeName, bytes justification", + tempResolver, + true + ); + + AttestationRequest memory request = AttestationRequest({ + schema: schemaId, + data: AttestationRequestData({ + recipient: recipient, + expirationTime: 0, + revocable: true, + refUID: bytes32(0), + data: abi.encode( + bytes32("Solidity"), + bytes("Saw them coding in Solidity") + ), + value: 0 + }) + }); + + vm.prank(attester); + vm.expectRevert(); // tempResolver will try to mint but isn't owner + eas.attest(request); + } + + function test_AttestationFailsIfBadgeDoesNotExist() public { + bytes32 schemaId = _registerSchema(); + + AttestationRequest memory request = AttestationRequest({ + schema: schemaId, + data: AttestationRequestData({ + recipient: recipient, + expirationTime: 0, + revocable: true, + refUID: bytes32(0), + data: abi.encode( + bytes32("NonExistent"), + bytes("Justification") + ), + value: 0 + }) + }); + + vm.prank(attester); + vm.expectRevert(); // resolver returns false -> EAS reverts + eas.attest(request); + } +} From 7950d44fa23938304b32e07a45b392543242824c Mon Sep 17 00:00:00 2001 From: Antoine Estienne Date: Tue, 4 Nov 2025 10:57:40 +0100 Subject: [PATCH 3/7] rejects duplicate attestations --- the-guild-smart-contracts/README.md | 19 +++++++----- .../src/TheGuildAttestationResolver.sol | 11 +++++++ .../test/TheGuildAttestationResolver.t.sol | 30 +++++++++++++++++++ 3 files changed, 53 insertions(+), 7 deletions(-) diff --git a/the-guild-smart-contracts/README.md b/the-guild-smart-contracts/README.md index 20f0aab..a9655e6 100644 --- a/the-guild-smart-contracts/README.md +++ b/the-guild-smart-contracts/README.md @@ -129,30 +129,35 @@ forge script script/TheGuildBadgeRegistry.s.sol:TheGuildBadgeRegistryScript --rp ### Tokens & Resolver - `TheGuildActivityToken` (symbol `TGA`) is a plain ERC20 with standard 18 decimals. The deployer is the initial owner and can mint. See `src/TheGuildActivityToken.sol`. -- `TheGuildAttestationResolver` is an EAS `SchemaResolver` that mints TGA to the attester on successful attestations. It takes the global `IEAS` and the deployed `TheGuildActivityToken` in its constructor. See `src/TheGuildAttestationResolver.sol`. +- `TheGuildAttestationResolver` is an EAS `SchemaResolver` that mints TGA to the attester on successful attestations and enforces basic validity rules. It takes the global `IEAS`, the deployed `TheGuildActivityToken`, and the deployed `TheGuildBadgeRegistry` in its constructor. See `src/TheGuildAttestationResolver.sol`. #### EAS Resolver behavior (TheGuildAttestationResolver) - Inherits `SchemaResolver` and implements: - - `onAttest(attestation, value)`: mints `10 * 10^decimals()` to `attestation.attester` and returns `true`. + - `onAttest(attestation, value)`: + - Decodes schema data `"bytes32 badgeName, bytes justification"`. + - Requires `badgeName` exists in `TheGuildBadgeRegistry`. + - Rejects duplicate attestations for the same `(attester, recipient, badgeName)` using a single-slot `keccak256(attester, recipient, badgeName)` mapping. + - If valid, mints `10 * 10^decimals()` to `attestation.attester` and returns `true`. - `onRevoke(...)`: no-op, returns `true`. - Deployment wiring: - Deploy `TheGuildActivityToken`. - - Deploy `TheGuildAttestationResolver` with `(IEAS, token)`. + - Deploy `TheGuildBadgeRegistry` (if not already deployed). + - Deploy `TheGuildAttestationResolver` with `(IEAS, token, badgeRegistry)`. - Transfer ownership of the token to the resolver so it can mint: `token.transferOwnership(resolver)`. -- Register your EAS Schema with `resolver` set to the resolver address (not the token!). When EAS processes an attestation for that schema, it will call the resolver which mints tokens. +- Register your EAS Schema with `resolver` set to the resolver address (not the token!). When EAS processes an attestation for that schema, it calls the resolver which validates and mints tokens. - Learn more about EAS resolvers: [Resolver Contracts](https://docs.attest.org/docs/core--concepts/resolver-contracts). Quick steps: -1. Deploy TGA and the resolver, then transfer token ownership to the resolver. +1. Deploy TGA, Badge Registry, and the Resolver; transfer token ownership to the resolver. 2. Register your schema in EAS with `resolver` set to the resolver address. -3. Create attestations against that schema. Each attestation mints 10 TGA to the attester automatically. +3. Create attestations against that schema. Each valid attestation mints 10 TGA to the attester automatically; unknown badges or duplicates are rejected. Deploy (example): ```shell -forge script script/TheGuildActivityToken.s.sol:TheGuildActivityTokenScript \ +forge script script/TheGuildAttestationResolver.s.sol:TheGuildActivityTokenScript \ --rpc-url \ --private-key \ --broadcast diff --git a/the-guild-smart-contracts/src/TheGuildAttestationResolver.sol b/the-guild-smart-contracts/src/TheGuildAttestationResolver.sol index 6e02b10..5c87783 100644 --- a/the-guild-smart-contracts/src/TheGuildAttestationResolver.sol +++ b/the-guild-smart-contracts/src/TheGuildAttestationResolver.sol @@ -15,6 +15,10 @@ contract TheGuildAttestationResolver is SchemaResolver { // TODO: get rid of this when we have our graphQL setup bytes32[] private _attestationIds; + // Tracks seen (attester, recipient, badgeName) tuples to prevent duplicates. + // Key = keccak256(abi.encode(attester, recipient, badgeName)) + mapping(bytes32 => bool) private _seenAttestations; + constructor( IEAS eas, TheGuildActivityToken token, @@ -33,6 +37,13 @@ contract TheGuildAttestationResolver is SchemaResolver { if (!_badgeRegistry.exists(badgeName)) { return false; } + bytes32 key = keccak256( + abi.encode(attestation.attester, attestation.recipient, badgeName) + ); + if (_seenAttestations[key]) { + return false; + } + _seenAttestations[key] = true; _token.mint(attestation.attester, 10 * (10 ** _token.decimals())); // TODO: get rid of this when we have our graphQL setup diff --git a/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol b/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol index 8b5f525..364bccf 100644 --- a/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol +++ b/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol @@ -135,4 +135,34 @@ contract TheGuildAttestationResolverTest is Test { vm.expectRevert(); // resolver returns false -> EAS reverts eas.attest(request); } + + function test_DuplicateAttestationIsRejected() public { + bytes32 schemaId = _registerSchema(); + // Ensure badge exists + badgeRegistry.createBadge( + bytes32("Rust"), + bytes32("Know how to code in Rust") + ); + + AttestationRequest memory request = AttestationRequest({ + schema: schemaId, + data: AttestationRequestData({ + recipient: recipient, + expirationTime: 0, + revocable: true, + refUID: bytes32(0), + data: abi.encode(bytes32("Rust"), bytes("First")), + value: 0 + }) + }); + + // First attest succeeds + vm.prank(attester); + eas.attest(request); + + // Second identical attestation should revert (resolver returns false) + vm.prank(attester); + vm.expectRevert(); + eas.attest(request); + } } From 95cd03f5e8752a4c9df6e0942f3f901bee0ba424 Mon Sep 17 00:00:00 2001 From: Antoine Estienne Date: Tue, 4 Nov 2025 11:19:09 +0100 Subject: [PATCH 4/7] full contract coverage https://github.com/TheSoftwareDevGuild/TheGuildGenesis/issues/29 --- the-guild-smart-contracts/.gitignore | 2 + the-guild-smart-contracts/foundry.toml | 3 + .../test/TheGuildAttestationResolver.t.sol | 63 ++++++++++++++++++- .../test/TheGuildBadgeRegistry.t.sol | 17 +++++ 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/the-guild-smart-contracts/.gitignore b/the-guild-smart-contracts/.gitignore index a5bbe7e..3485036 100644 --- a/the-guild-smart-contracts/.gitignore +++ b/the-guild-smart-contracts/.gitignore @@ -14,3 +14,5 @@ docs/ # Dotenv file .env + +lcov.info \ No newline at end of file diff --git a/the-guild-smart-contracts/foundry.toml b/the-guild-smart-contracts/foundry.toml index a8f7f71..3accb69 100644 --- a/the-guild-smart-contracts/foundry.toml +++ b/the-guild-smart-contracts/foundry.toml @@ -2,6 +2,9 @@ src = "src" out = "out" libs = ["lib"] +coverage = true +# Exclude scripts, libs, and tests from coverage +no_match_coverage = "^(script/|lib/|test/)" # Deterministic deployments settings (see: https://getfoundry.sh/guides/deterministic-deployments-using-create2) solc = "0.8.28" diff --git a/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol b/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol index 364bccf..3ff736a 100644 --- a/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol +++ b/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol @@ -9,7 +9,7 @@ import {TheGuildBadgeRegistry} from "../src/TheGuildBadgeRegistry.sol"; // EAS contracts import {EAS} from "eas-contracts/EAS.sol"; import {SchemaRegistry} from "eas-contracts/SchemaRegistry.sol"; -import {IEAS, AttestationRequest, AttestationRequestData} from "eas-contracts/IEAS.sol"; +import {IEAS, AttestationRequest, AttestationRequestData, Attestation, RevocationRequestData, RevocationRequest} from "eas-contracts/IEAS.sol"; contract TheGuildAttestationResolverTest is Test { TheGuildActivityToken private token; @@ -136,6 +136,67 @@ contract TheGuildAttestationResolverTest is Test { eas.attest(request); } + function test_AttestationIndexerGetters() public { + bytes32 schemaId = _registerSchema(); + badgeRegistry.createBadge( + bytes32("Rust"), + bytes32("Know how to code in Rust") + ); + + vm.prank(attester); + bytes32 uid = eas.attest( + AttestationRequest({ + schema: schemaId, + data: AttestationRequestData({ + recipient: recipient, + expirationTime: 0, + revocable: true, + refUID: bytes32(0), + data: abi.encode(bytes32("Rust"), bytes("any")), + value: 0 + }) + }) + ); + + assertEq(resolver.getAttestationCount(), 1); + Attestation memory a = resolver.getAttestationAtIndex(0); + assertEq(a.uid, uid); + assertEq(a.attester, attester); + assertEq(a.recipient, recipient); + } + + function test_Revoke_NoRevert() public { + bytes32 schemaId = _registerSchema(); + badgeRegistry.createBadge( + bytes32("Rust"), + bytes32("Know how to code in Rust") + ); + + vm.prank(attester); + bytes32 uid = eas.attest( + AttestationRequest({ + schema: schemaId, + data: AttestationRequestData({ + recipient: recipient, + expirationTime: 0, + revocable: true, + refUID: bytes32(0), + data: abi.encode(bytes32("Rust"), bytes("any")), + value: 0 + }) + }) + ); + + vm.prank(attester); + eas.revoke( + RevocationRequest({ + schema: schemaId, + data: RevocationRequestData({uid: uid, value: 0}) + }) + ); + // success == no revert + } + function test_DuplicateAttestationIsRejected() public { bytes32 schemaId = _registerSchema(); // Ensure badge exists diff --git a/the-guild-smart-contracts/test/TheGuildBadgeRegistry.t.sol b/the-guild-smart-contracts/test/TheGuildBadgeRegistry.t.sol index a521c40..3aa3523 100644 --- a/the-guild-smart-contracts/test/TheGuildBadgeRegistry.t.sol +++ b/the-guild-smart-contracts/test/TheGuildBadgeRegistry.t.sol @@ -52,4 +52,21 @@ contract TheGuildBadgeRegistryTest is Test { vm.expectRevert(bytes("EMPTY_NAME")); registry.createBadge(bytes32(0), bytes32("desc")); } + + function test_GetBadgeAt_ByIndex() public { + bytes32 a = bytes32("BADGE_A"); + bytes32 b = bytes32("BADGE_B"); + registry.createBadge(a, bytes32("descA")); + registry.createBadge(b, bytes32("descB")); + + (bytes32 n0, bytes32 d0, address c0) = registry.getBadgeAt(0); + assertEq(n0, a); + assertEq(d0, bytes32("descA")); + assertEq(c0, address(this)); + + (bytes32 n1, bytes32 d1, address c1) = registry.getBadgeAt(1); + assertEq(n1, b); + assertEq(d1, bytes32("descB")); + assertEq(c1, address(this)); + } } From aedf057f7b56a9544e479c45e64766ee0b8b1c0e Mon Sep 17 00:00:00 2001 From: Antoine Estienne Date: Tue, 4 Nov 2025 14:21:02 +0100 Subject: [PATCH 5/7] update deployment script for create2 and deploy on amoy --- the-guild-smart-contracts/.env.example | 7 +- the-guild-smart-contracts/README.md | 18 +- .../80002/run-latest.json | 575 ++++++++++++------ the-guild-smart-contracts/deployAmoy.sh | 24 +- the-guild-smart-contracts/deployLocal.sh | 73 +++ .../script/FullDeploymentScript.s.sol | 12 +- .../script/TheGuildAttestationResolver.s.sol | 6 +- .../src/TheGuildActivityToken.sol | 4 +- .../test/TheGuildActivityToken.t.sol | 2 +- .../test/TheGuildAttestationResolver.t.sol | 6 +- 10 files changed, 516 insertions(+), 211 deletions(-) create mode 100755 the-guild-smart-contracts/deployLocal.sh diff --git a/the-guild-smart-contracts/.env.example b/the-guild-smart-contracts/.env.example index fc52654..edc8719 100644 --- a/the-guild-smart-contracts/.env.example +++ b/the-guild-smart-contracts/.env.example @@ -4,10 +4,6 @@ # Accepts uint value; example values: 1, 123456, etc. CREATE2_SALT=1 -# RPC URL and PRIVATE KEY are typically provided at runtime to forge script -# RPC_URL= -# PRIVATE_KEY= - # EAS addresses for networks not hardcoded in the deploy script. # Generic fallback for any other network (used if chain isn't matched) EAS_ADDRESS= @@ -18,3 +14,6 @@ BASE_SEPOLIA_URL=https://base-sepolia.therpc.io # ETHERSCAN KEY ETHERSCAN_API_KEY= + +# For deployment +PRIVATE_KEY= \ No newline at end of file diff --git a/the-guild-smart-contracts/README.md b/the-guild-smart-contracts/README.md index a9655e6..bcf37a2 100644 --- a/the-guild-smart-contracts/README.md +++ b/the-guild-smart-contracts/README.md @@ -22,19 +22,25 @@ For detailed frontend integration instructions, see [INTEGRATION.md](./INTEGRATI ### Amoy -Salt: "theguild_v_0.1.0" +Salt: "theguild_v_0.1.2" TheGuildActivityToken -https://amoy.polygonscan.com/address/0x5db978bc69e54250f577ed343273508baea136cd +https://amoy.polygonscan.com/address/0x4649490B118389d0Be8F48b8953eFb235d8CB545 TheGuildBadgeRegistry -https://amoy.polygonscan.com/address/0xc142ab6b4688b7b81cb4cc8b305f517bba3bfd25 +https://amoy.polygonscan.com/address/0x94f5F12BE60a338D263882a1A49E81ca8A0c30F4 + +TheGuildAttestationResolver +https://amoy.polygonscan.com/address/0x8B481fB56b133b590348B2B3B1D3Ae2fce0D4324 + +TheGuildBadgeRanking +https://amoy.polygonscan.com/address/0x435576DFA5B151a6A1c8a4B5EdDfB4ceEd5A55aF EAS Schema ID: -0xb167f07504166f717f2a2710dbcfbfdf8fad6e8c6128c1a7fa80768f61b1d0b2 +0xbcd7561083784f9b5a1c2b3ddb7aa9db263d43c58f7374cfa4875646824a47de ### Amoy for dev -Salt: "theguild_v_0.1.1_dev" +Salt: "theguild_v_0.1.3_dev" TheGuildActivityToken https://amoy.polygonscan.com/address/0x82eba5400b4e914a9b5e4573867b9a73c488c1ed @@ -46,7 +52,7 @@ EAS Schema ID: 0x8ef2fdb896e42534302cc992c2b2daf614ccabf3fc6d78ce15dc35534b8fa481 ### Base Sepolia -Salt: "theguild_v_0.1.1" +Salt: "theguild_v_0.1.3" TheGuildActivityToken https://amoy.polygonscan.com/address/0xba838e90ca2a84aed0de2119e7e6f53b9174ce42 diff --git a/the-guild-smart-contracts/broadcast/FullDeploymentScript.s.sol/80002/run-latest.json b/the-guild-smart-contracts/broadcast/FullDeploymentScript.s.sol/80002/run-latest.json index 9ceef46..a87e593 100644 --- a/the-guild-smart-contracts/broadcast/FullDeploymentScript.s.sol/80002/run-latest.json +++ b/the-guild-smart-contracts/broadcast/FullDeploymentScript.s.sol/80002/run-latest.json @@ -1,73 +1,117 @@ { "transactions": [ { - "hash": "0xd472cbae6067f95ea976a9dcd83ac4d2eda56eb697900c75e8a7188829366019", + "hash": "0xef9d70568de2281d3f3471667de3ab255534c523fcebe779a2d423720b604880", "transactionType": "CREATE2", "contractName": "TheGuildActivityToken", - "contractAddress": "0x82eba5400b4e914a9b5e4573867b9a73c488c1ed", + "contractAddress": "0x4649490b118389d0be8f48b8953efb235d8cb545", "function": null, "arguments": [ - "0xb101275a60d8bfb14529C421899aD7CA1Ae5B5Fc" + "0x6cfD0753EC4da15Dcb418E11e921C0665c1d1cBf" ], "transaction": { "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0x2e0f10", + "gas": "0x18196d", "value": "0x0", - "input": "0x7468656775696c645f765f302e312e315f646576000000000000000000000000610100604052348015610010575f5ffd5b50604051612ba9380380612ba983398181016040528101906100329190610334565b80600160045f336040518060400160405280601581526020017f5468654775696c644163746976697479546f6b656e00000000000000000000008152506040518060400160405280600381526020017f544741000000000000000000000000000000000000000000000000000000000081525081600390816100b4919061059c565b5080600490816100c4919061059c565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610137575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161012e919061067a565b60405180910390fd5b6101468161020260201b60201c565b5082608081815250508160a081815250508060c081815250505050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036101c7576040517f83780ffe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff16815250505050610693565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102f2826102c9565b9050919050565b5f610303826102e8565b9050919050565b610313816102f9565b811461031d575f5ffd5b50565b5f8151905061032e8161030a565b92915050565b5f60208284031215610349576103486102c5565b5b5f61035684828501610320565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806103da57607f821691505b6020821081036103ed576103ec610396565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261044f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610414565b6104598683610414565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61049d61049861049384610471565b61047a565b610471565b9050919050565b5f819050919050565b6104b683610483565b6104ca6104c2826104a4565b848454610420565b825550505050565b5f5f905090565b6104e16104d2565b6104ec8184846104ad565b505050565b5b8181101561050f576105045f826104d9565b6001810190506104f2565b5050565b601f82111561055457610525816103f3565b61052e84610405565b8101602085101561053d578190505b61055161054985610405565b8301826104f1565b50505b505050565b5f82821c905092915050565b5f6105745f1984600802610559565b1980831691505092915050565b5f61058c8383610565565b9150826002028217905092915050565b6105a58261035f565b67ffffffffffffffff8111156105be576105bd610369565b5b6105c882546103c3565b6105d3828285610513565b5f60209050601f831160018114610604575f84156105f2578287015190505b6105fc8582610581565b865550610663565b601f198416610612866103f3565b5f5b8281101561063957848901518255600182019150602085019450602081019050610614565b868310156106565784890151610652601f891682610565565b8355505b6001600288020188555050505b505050505050565b610674816102e8565b82525050565b5f60208201905061068d5f83018461066b565b92915050565b60805160a05160c05160e0516124dc6106cd5f395f8181610a51015261109a01525f6106bb01525f61069201525f61066901526124dc5ff3fe60806040526004361061012d575f3560e01c80638da5cb5b116100aa578063a9059cbb1161006e578063a9059cbb1461042a578063ce46e04614610466578063dd62ed3e14610490578063e49617e1146104cc578063e60c3505146104fc578063f2fde38b1461052c57610172565b80638da5cb5b1461034057806391db0b7e1461036a57806395d89b411461039a578063962ea8ae146103c45780639df97fd7146103ee57610172565b806340c10f19116100f157806340c10f191461026c57806354fd4d501461029457806370a08231146102be578063715018a6146102fa57806388e5b2d91461031057610172565b806306fdde0314610176578063095ea7b3146101a057806318160ddd146101dc57806323b872dd14610206578063313ce5671461024257610172565b366101725761013a610554565b610170576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f5ffd5b348015610181575f5ffd5b5061018a61055b565b60405161019791906117d8565b60405180910390f35b3480156101ab575f5ffd5b506101c660048036038101906101c19190611896565b6105eb565b6040516101d391906118ee565b60405180910390f35b3480156101e7575f5ffd5b506101f061060d565b6040516101fd9190611916565b60405180910390f35b348015610211575f5ffd5b5061022c6004803603810190610227919061192f565b610616565b60405161023991906118ee565b60405180910390f35b34801561024d575f5ffd5b50610256610644565b604051610263919061199a565b60405180910390f35b348015610277575f5ffd5b50610292600480360381019061028d9190611896565b61064c565b005b34801561029f575f5ffd5b506102a8610662565b6040516102b591906117d8565b60405180910390f35b3480156102c9575f5ffd5b506102e460048036038101906102df91906119b3565b610705565b6040516102f19190611916565b60405180910390f35b348015610305575f5ffd5b5061030e61074a565b005b61032a60048036038101906103259190611a94565b61075d565b60405161033791906118ee565b60405180910390f35b34801561034b575f5ffd5b50610354610870565b6040516103619190611b21565b60405180910390f35b610384600480360381019061037f9190611a94565b610898565b60405161039191906118ee565b60405180910390f35b3480156103a5575f5ffd5b506103ae6109ab565b6040516103bb91906117d8565b60405180910390f35b3480156103cf575f5ffd5b506103d8610a3b565b6040516103e59190611916565b60405180910390f35b3480156103f9575f5ffd5b50610414600480360381019061040f9190611b3a565b610a47565b6040516104219190611ce6565b60405180910390f35b348015610435575f5ffd5b50610450600480360381019061044b9190611896565b610b0d565b60405161045d91906118ee565b60405180910390f35b348015610471575f5ffd5b5061047a610554565b60405161048791906118ee565b60405180910390f35b34801561049b575f5ffd5b506104b660048036038101906104b19190611d06565b610b2f565b6040516104c39190611916565b60405180910390f35b6104e660048036038101906104e19190611d67565b610bb1565b6040516104f391906118ee565b60405180910390f35b61051660048036038101906105119190611d67565b610bcb565b60405161052391906118ee565b60405180910390f35b348015610537575f5ffd5b50610552600480360381019061054d91906119b3565b610be5565b005b5f5f905090565b60606003805461056a90611ddb565b80601f016020809104026020016040519081016040528092919081815260200182805461059690611ddb565b80156105e15780601f106105b8576101008083540402835291602001916105e1565b820191905f5260205f20905b8154815290600101906020018083116105c457829003601f168201915b5050505050905090565b5f5f6105f5610c69565b9050610602818585610c70565b600191505092915050565b5f600254905090565b5f5f610620610c69565b905061062d858285610c82565b610638858585610d15565b60019150509392505050565b5f6012905090565b610654610e05565b61065e8282610e8c565b5050565b606061068d7f0000000000000000000000000000000000000000000000000000000000000000610f0b565b6106b67f0000000000000000000000000000000000000000000000000000000000000000610f0b565b6106df7f0000000000000000000000000000000000000000000000000000000000000000610f0b565b6040516020016106f193929190611e8f565b604051602081830303815290604052905090565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610752610e05565b61075b5f610fd5565b565b5f610766611098565b5f8585905090508383905081146107a9576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f3490505f5f90505b82811015610860575f8686838181106107ce576107cd611ed5565b5b90506020020135905082811115610811576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61083f89898481811061082757610826611ed5565b5b90506020028101906108399190611f06565b8261111f565b61084f575f945050505050610868565b8083039250508060010190506107b2565b506001925050505b949350505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f6108a1611098565b5f8585905090508383905081146108e4576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f3490505f5f90505b8281101561099b575f86868381811061090957610908611ed5565b5b9050602002013590508281111561094c576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61097a89898481811061096257610961611ed5565b5b90506020028101906109749190611f06565b8261112a565b61098a575f9450505050506109a3565b8083039250508060010190506108ed565b506001925050505b949350505050565b6060600480546109ba90611ddb565b80601f01602080910402602001604051908101604052809291908181526020018280546109e690611ddb565b8015610a315780601f10610a0857610100808354040283529160200191610a31565b820191905f5260205f20905b815481529060010190602001808311610a1457829003601f168201915b5050505050905090565b5f600680549050905090565b610a4f6116d2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a3112a6460068481548110610a9f57610a9e611ed5565b5b905f5260205f2001546040518263ffffffff1660e01b8152600401610ac49190611f3d565b5f60405180830381865afa158015610ade573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190610b069190612219565b9050919050565b5f5f610b17610c69565b9050610b24818585610d15565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f610bba611098565b610bc4823461111f565b9050919050565b5f610bd4611098565b610bde823461112a565b9050919050565b610bed610e05565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c5d575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610c549190611b21565b60405180910390fd5b610c6681610fd5565b50565b5f33905090565b610c7d8383836001611199565b505050565b5f610c8d8484610b2f565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811015610d0f5781811015610d00578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401610cf793929190612260565b60405180910390fd5b610d0e84848484035f611199565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610d85575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610d7c9190611b21565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610df5575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610dec9190611b21565b60405180910390fd5b610e00838383611368565b505050565b610e0d610c69565b73ffffffffffffffffffffffffffffffffffffffff16610e2b610870565b73ffffffffffffffffffffffffffffffffffffffff1614610e8a57610e4e610c69565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610e819190611b21565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610efc575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401610ef39190611b21565b60405180910390fd5b610f075f8383611368565b5050565b60605f6001610f1984611581565b0190505f8167ffffffffffffffff811115610f3757610f36611f5a565b5b6040519080825280601f01601f191660200182016040528015610f695781602001600182028036833780820191505090505b5090505f82602083010190505b600115610fca578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581610fbf57610fbe612295565b5b0494505f8503610f76575b819350505050919050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461111d576040517f4ca8886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6001905092915050565b5f6111668360e001602081019061114191906119b3565b611149610644565b600a611155919061241e565b600a6111619190612468565b610e8c565b6006835f0135908060018154018082558091505060019003905f5260205f20015f90919091909150556001905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611209575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016112009190611b21565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611279575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016112709190611b21565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611362578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516113599190611916565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113b8578060025f8282546113ac91906124a9565b92505081905550611486565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611441578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161143893929190612260565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114cd578060025f8282540392505081905550611517565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115749190611916565b60405180910390a3505050565b5f5f5f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106115dd577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816115d3576115d2612295565b5b0492506040810190505b6d04ee2d6d415b85acef8100000000831061161a576d04ee2d6d415b85acef810000000083816116105761160f612295565b5b0492506020810190505b662386f26fc10000831061164957662386f26fc10000838161163f5761163e612295565b5b0492506010810190505b6305f5e1008310611672576305f5e100838161166857611667612295565b5b0492506008810190505b612710831061169757612710838161168d5761168c612295565b5b0492506004810190505b606483106116ba57606483816116b0576116af612295565b5b0492506002810190505b600a83106116c9576001810190505b80915050919050565b6040518061014001604052805f81526020015f81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f15158152602001606081525090565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6117aa82611768565b6117b48185611772565b93506117c4818560208601611782565b6117cd81611790565b840191505092915050565b5f6020820190508181035f8301526117f081846117a0565b905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61183282611809565b9050919050565b61184281611828565b811461184c575f5ffd5b50565b5f8135905061185d81611839565b92915050565b5f819050919050565b61187581611863565b811461187f575f5ffd5b50565b5f813590506118908161186c565b92915050565b5f5f604083850312156118ac576118ab611801565b5b5f6118b98582860161184f565b92505060206118ca85828601611882565b9150509250929050565b5f8115159050919050565b6118e8816118d4565b82525050565b5f6020820190506119015f8301846118df565b92915050565b61191081611863565b82525050565b5f6020820190506119295f830184611907565b92915050565b5f5f5f6060848603121561194657611945611801565b5b5f6119538682870161184f565b93505060206119648682870161184f565b925050604061197586828701611882565b9150509250925092565b5f60ff82169050919050565b6119948161197f565b82525050565b5f6020820190506119ad5f83018461198b565b92915050565b5f602082840312156119c8576119c7611801565b5b5f6119d58482850161184f565b91505092915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126119ff576119fe6119de565b5b8235905067ffffffffffffffff811115611a1c57611a1b6119e2565b5b602083019150836020820283011115611a3857611a376119e6565b5b9250929050565b5f5f83601f840112611a5457611a536119de565b5b8235905067ffffffffffffffff811115611a7157611a706119e2565b5b602083019150836020820283011115611a8d57611a8c6119e6565b5b9250929050565b5f5f5f5f60408587031215611aac57611aab611801565b5b5f85013567ffffffffffffffff811115611ac957611ac8611805565b5b611ad5878288016119ea565b9450945050602085013567ffffffffffffffff811115611af857611af7611805565b5b611b0487828801611a3f565b925092505092959194509250565b611b1b81611828565b82525050565b5f602082019050611b345f830184611b12565b92915050565b5f60208284031215611b4f57611b4e611801565b5b5f611b5c84828501611882565b91505092915050565b5f819050919050565b611b7781611b65565b82525050565b5f67ffffffffffffffff82169050919050565b611b9981611b7d565b82525050565b611ba881611828565b82525050565b611bb7816118d4565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f611be182611bbd565b611beb8185611bc7565b9350611bfb818560208601611782565b611c0481611790565b840191505092915050565b5f61014083015f830151611c255f860182611b6e565b506020830151611c386020860182611b6e565b506040830151611c4b6040860182611b90565b506060830151611c5e6060860182611b90565b506080830151611c716080860182611b90565b5060a0830151611c8460a0860182611b6e565b5060c0830151611c9760c0860182611b9f565b5060e0830151611caa60e0860182611b9f565b50610100830151611cbf610100860182611bae565b50610120830151848203610120860152611cd98282611bd7565b9150508091505092915050565b5f6020820190508181035f830152611cfe8184611c0f565b905092915050565b5f5f60408385031215611d1c57611d1b611801565b5b5f611d298582860161184f565b9250506020611d3a8582860161184f565b9150509250929050565b5f5ffd5b5f6101408284031215611d5e57611d5d611d44565b5b81905092915050565b5f60208284031215611d7c57611d7b611801565b5b5f82013567ffffffffffffffff811115611d9957611d98611805565b5b611da584828501611d48565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611df257607f821691505b602082108103611e0557611e04611dae565b5b50919050565b5f81905092915050565b5f611e1f82611768565b611e298185611e0b565b9350611e39818560208601611782565b80840191505092915050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f611e79600183611e0b565b9150611e8482611e45565b600182019050919050565b5f611e9a8286611e15565b9150611ea582611e6d565b9150611eb18285611e15565b9150611ebc82611e6d565b9150611ec88284611e15565b9150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f5ffd5b5f8235600161014003833603038112611f2257611f21611f02565b5b80830191505092915050565b611f3781611b65565b82525050565b5f602082019050611f505f830184611f2e565b92915050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611f9082611790565b810181811067ffffffffffffffff82111715611faf57611fae611f5a565b5b80604052505050565b5f611fc16117f8565b9050611fcd8282611f87565b919050565b5f5ffd5b611fdf81611b65565b8114611fe9575f5ffd5b50565b5f81519050611ffa81611fd6565b92915050565b61200981611b7d565b8114612013575f5ffd5b50565b5f8151905061202481612000565b92915050565b5f8151905061203881611839565b92915050565b612047816118d4565b8114612051575f5ffd5b50565b5f815190506120628161203e565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561208657612085611f5a565b5b61208f82611790565b9050602081019050919050565b5f6120ae6120a98461206c565b611fb8565b9050828152602081018484840111156120ca576120c9612068565b5b6120d5848285611782565b509392505050565b5f82601f8301126120f1576120f06119de565b5b815161210184826020860161209c565b91505092915050565b5f61014082840312156121205761211f611f56565b5b61212b610140611fb8565b90505f61213a84828501611fec565b5f83015250602061214d84828501611fec565b602083015250604061216184828501612016565b604083015250606061217584828501612016565b606083015250608061218984828501612016565b60808301525060a061219d84828501611fec565b60a08301525060c06121b18482850161202a565b60c08301525060e06121c58482850161202a565b60e0830152506101006121da84828501612054565b6101008301525061012082015167ffffffffffffffff811115612200576121ff611fd2565b5b61220c848285016120dd565b6101208301525092915050565b5f6020828403121561222e5761222d611801565b5b5f82015167ffffffffffffffff81111561224b5761224a611805565b5b6122578482850161210a565b91505092915050565b5f6060820190506122735f830186611b12565b6122806020830185611907565b61228d6040830184611907565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f5f8291508390505b6001851115612344578086048111156123205761231f6122c2565b5b600185161561232f5780820291505b808102905061233d856122ef565b9450612304565b94509492505050565b5f8261235c5760019050612417565b81612369575f9050612417565b816001811461237f5760028114612389576123b8565b6001915050612417565b60ff84111561239b5761239a6122c2565b5b8360020a9150848211156123b2576123b16122c2565b5b50612417565b5060208310610133831016604e8410600b84101617156123ed5782820a9050838111156123e8576123e76122c2565b5b612417565b6123fa84848460016122fb565b92509050818404811115612411576124106122c2565b5b81810290505b9392505050565b5f61242882611863565b91506124338361197f565b92506124607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461234d565b905092915050565b5f61247282611863565b915061247d83611863565b925082820261248b81611863565b915082820484148315176124a2576124a16122c2565b5b5092915050565b5f6124b382611863565b91506124be83611863565b92508282019050808211156124d6576124d56122c2565b5b9291505056000000000000000000000000b101275a60d8bfb14529c421899ad7ca1ae5b5fc", - "nonce": "0x41", + "input": "0x7468656775696c645f765f302e312e3300000000000000000000000000000000608060405234801561000f575f5ffd5b506040516116b93803806116b983398181016040528101906100319190610267565b806040518060400160405280601581526020017f5468654775696c644163746976697479546f6b656e00000000000000000000008152506040518060400160405280600381526020017f544741000000000000000000000000000000000000000000000000000000000081525081600390816100ad91906104cf565b5080600490816100bd91906104cf565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610130575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161012791906105ad565b60405180910390fd5b61013f8161014660201b60201c565b50506105c6565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6102368261020d565b9050919050565b6102468161022c565b8114610250575f5ffd5b50565b5f815190506102618161023d565b92915050565b5f6020828403121561027c5761027b610209565b5b5f61028984828501610253565b91505092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061030d57607f821691505b6020821081036103205761031f6102c9565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026103827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610347565b61038c8683610347565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6103d06103cb6103c6846103a4565b6103ad565b6103a4565b9050919050565b5f819050919050565b6103e9836103b6565b6103fd6103f5826103d7565b848454610353565b825550505050565b5f5f905090565b610414610405565b61041f8184846103e0565b505050565b5b81811015610442576104375f8261040c565b600181019050610425565b5050565b601f8211156104875761045881610326565b61046184610338565b81016020851015610470578190505b61048461047c85610338565b830182610424565b50505b505050565b5f82821c905092915050565b5f6104a75f198460080261048c565b1980831691505092915050565b5f6104bf8383610498565b9150826002028217905092915050565b6104d882610292565b67ffffffffffffffff8111156104f1576104f061029c565b5b6104fb82546102f6565b610506828285610446565b5f60209050601f831160018114610537575f8415610525578287015190505b61052f85826104b4565b865550610596565b601f19841661054586610326565b5f5b8281101561056c57848901518255600182019150602085019450602081019050610547565b868310156105895784890151610585601f891682610498565b8355505b6001600288020188555050505b505050505050565b6105a78161022c565b82525050565b5f6020820190506105c05f83018461059e565b92915050565b6110e6806105d35f395ff3fe608060405234801561000f575f5ffd5b50600436106100cd575f3560e01c806370a082311161008a57806395d89b411161006457806395d89b41146101ff578063a9059cbb1461021d578063dd62ed3e1461024d578063f2fde38b1461027d576100cd565b806370a08231146101a7578063715018a6146101d75780638da5cb5b146101e1576100cd565b806306fdde03146100d1578063095ea7b3146100ef57806318160ddd1461011f57806323b872dd1461013d578063313ce5671461016d57806340c10f191461018b575b5f5ffd5b6100d9610299565b6040516100e69190610d95565b60405180910390f35b61010960048036038101906101049190610e46565b610329565b6040516101169190610e9e565b60405180910390f35b61012761034b565b6040516101349190610ec6565b60405180910390f35b61015760048036038101906101529190610edf565b610354565b6040516101649190610e9e565b60405180910390f35b610175610382565b6040516101829190610f4a565b60405180910390f35b6101a560048036038101906101a09190610e46565b61038a565b005b6101c160048036038101906101bc9190610f63565b6103a0565b6040516101ce9190610ec6565b60405180910390f35b6101df6103e5565b005b6101e96103f8565b6040516101f69190610f9d565b60405180910390f35b610207610420565b6040516102149190610d95565b60405180910390f35b61023760048036038101906102329190610e46565b6104b0565b6040516102449190610e9e565b60405180910390f35b61026760048036038101906102629190610fb6565b6104d2565b6040516102749190610ec6565b60405180910390f35b61029760048036038101906102929190610f63565b610554565b005b6060600380546102a890611021565b80601f01602080910402602001604051908101604052809291908181526020018280546102d490611021565b801561031f5780601f106102f65761010080835404028352916020019161031f565b820191905f5260205f20905b81548152906001019060200180831161030257829003601f168201915b5050505050905090565b5f5f6103336105d8565b90506103408185856105df565b600191505092915050565b5f600254905090565b5f5f61035e6105d8565b905061036b8582856105f1565b610376858585610684565b60019150509392505050565b5f6012905090565b610392610774565b61039c82826107fb565b5050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6103ed610774565b6103f65f61087a565b565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461042f90611021565b80601f016020809104026020016040519081016040528092919081815260200182805461045b90611021565b80156104a65780601f1061047d576101008083540402835291602001916104a6565b820191905f5260205f20905b81548152906001019060200180831161048957829003601f168201915b5050505050905090565b5f5f6104ba6105d8565b90506104c7818585610684565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b61055c610774565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036105cc575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016105c39190610f9d565b60405180910390fd5b6105d58161087a565b50565b5f33905090565b6105ec838383600161093d565b505050565b5f6105fc84846104d2565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81101561067e578181101561066f578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161066693929190611051565b60405180910390fd5b61067d84848484035f61093d565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106f4575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016106eb9190610f9d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610764575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161075b9190610f9d565b60405180910390fd5b61076f838383610b0c565b505050565b61077c6105d8565b73ffffffffffffffffffffffffffffffffffffffff1661079a6103f8565b73ffffffffffffffffffffffffffffffffffffffff16146107f9576107bd6105d8565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016107f09190610f9d565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361086b575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016108629190610f9d565b60405180910390fd5b6108765f8383610b0c565b5050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036109ad575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016109a49190610f9d565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a1d575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610a149190610f9d565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610b06578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610afd9190610ec6565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b5c578060025f828254610b5091906110b3565b92505081905550610c2a565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610be5578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610bdc93929190611051565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c71578060025f8282540392505081905550610cbb565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610d189190610ec6565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610d6782610d25565b610d718185610d2f565b9350610d81818560208601610d3f565b610d8a81610d4d565b840191505092915050565b5f6020820190508181035f830152610dad8184610d5d565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610de282610db9565b9050919050565b610df281610dd8565b8114610dfc575f5ffd5b50565b5f81359050610e0d81610de9565b92915050565b5f819050919050565b610e2581610e13565b8114610e2f575f5ffd5b50565b5f81359050610e4081610e1c565b92915050565b5f5f60408385031215610e5c57610e5b610db5565b5b5f610e6985828601610dff565b9250506020610e7a85828601610e32565b9150509250929050565b5f8115159050919050565b610e9881610e84565b82525050565b5f602082019050610eb15f830184610e8f565b92915050565b610ec081610e13565b82525050565b5f602082019050610ed95f830184610eb7565b92915050565b5f5f5f60608486031215610ef657610ef5610db5565b5b5f610f0386828701610dff565b9350506020610f1486828701610dff565b9250506040610f2586828701610e32565b9150509250925092565b5f60ff82169050919050565b610f4481610f2f565b82525050565b5f602082019050610f5d5f830184610f3b565b92915050565b5f60208284031215610f7857610f77610db5565b5b5f610f8584828501610dff565b91505092915050565b610f9781610dd8565b82525050565b5f602082019050610fb05f830184610f8e565b92915050565b5f5f60408385031215610fcc57610fcb610db5565b5b5f610fd985828601610dff565b9250506020610fea85828601610dff565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061103857607f821691505b60208210810361104b5761104a610ff4565b5b50919050565b5f6060820190506110645f830186610f8e565b6110716020830185610eb7565b61107e6040830184610eb7565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6110bd82610e13565b91506110c883610e13565b92508282019050808211156110e0576110df611086565b5b92915050560000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", + "nonce": "0x4a", "chainId": "0x13882" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x155e08489676344c298734508d8f8ffd467da20c6743c6b345d2006da07f6c1e", - "transactionType": "CALL", - "contractName": "SchemaRegistry", - "contractAddress": "0x23c5701a1bda89c61d181bd79e5203c730708ae7", - "function": "register(string,address,bool)", - "arguments": [ - "bytes32 badgeName, bytes32 justification", - "0x82eBa5400b4e914A9b5e4573867b9a73C488c1ed", - "true" - ], + "hash": "0x1441a182605be12251f5006f3955f7dcfce6426aa817983cc52511a8cce52a45", + "transactionType": "CREATE2", + "contractName": "TheGuildBadgeRegistry", + "contractAddress": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", + "function": null, + "arguments": null, "transaction": { "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", - "to": "0x23c5701a1bda89c61d181bd79e5203c730708ae7", - "gas": "0x31cee", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xc0d11", "value": "0x0", - "input": "0x60d7a278000000000000000000000000000000000000000000000000000000000000006000000000000000000000000082eba5400b4e914a9b5e4573867b9a73c488c1ed00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000028627974657333322062616467654e616d652c2062797465733332206a757374696669636174696f6e000000000000000000000000000000000000000000000000", - "nonce": "0x42", + "input": "0x7468656775696c645f765f302e312e33000000000000000000000000000000006080604052348015600e575f5ffd5b506108cf8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610060575f3560e01c80633580dbc71461006457806338a699a4146100805780634d3c901d146100b057806377002fcf146100e257806381407b1b14610114578063a490a69714610144575b5f5ffd5b61007e6004803603810190610079919061059c565b610162565b005b61009a600480360381019061009591906105da565b610346565b6040516100a7919061061f565b60405180910390f35b6100ca60048036038101906100c5919061066b565b61036c565b6040516100d9939291906106e4565b60405180910390f35b6100fc60048036038101906100f791906105da565b610432565b60405161010b939291906106e4565b60405180910390f35b61012e6004803603810190610129919061066b565b610534565b60405161013b9190610719565b60405180910390f35b61014c610559565b6040516101599190610741565b60405180910390f35b5f5f1b82036101a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d906107b4565b60405180910390fd5b60015f8381526020019081526020015f205f9054906101000a900460ff1615610204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101fb9061081c565b60405180910390fd5b5f60405180606001604052808481526020018381526020013373ffffffffffffffffffffffffffffffffffffffff168152509050805f5f8581526020019081526020015f205f820151815f0155602082015181600101556040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506001805f8581526020019081526020015f205f6101000a81548160ff021916908315150217905550600283908060018154018082558091505060019003905f5260205f20015f90919091909150553373ffffffffffffffffffffffffffffffffffffffff16837f7d648d3c718d609c93c086fd770653e10a64c5afe41e0b1b0b4bb76bba24c479846040516103399190610719565b60405180910390a3505050565b5f60015f8381526020019081526020015f205f9054906101000a900460ff169050919050565b5f5f5f5f600285815481106103845761038361083a565b5b905f5260205f20015490505f5f5f8381526020019081526020015f206040518060600160405290815f820154815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050805f01518160200151826040015194509450945050509193909250565b5f5f5f60015f8581526020019081526020015f205f9054906101000a900460ff16610492576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610489906108b1565b60405180910390fd5b5f5f5f8681526020019081526020015f206040518060600160405290815f820154815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050805f015181602001518260400151935093509350509193909250565b5f600282815481106105495761054861083a565b5b905f5260205f2001549050919050565b5f600280549050905090565b5f5ffd5b5f819050919050565b61057b81610569565b8114610585575f5ffd5b50565b5f8135905061059681610572565b92915050565b5f5f604083850312156105b2576105b1610565565b5b5f6105bf85828601610588565b92505060206105d085828601610588565b9150509250929050565b5f602082840312156105ef576105ee610565565b5b5f6105fc84828501610588565b91505092915050565b5f8115159050919050565b61061981610605565b82525050565b5f6020820190506106325f830184610610565b92915050565b5f819050919050565b61064a81610638565b8114610654575f5ffd5b50565b5f8135905061066581610641565b92915050565b5f602082840312156106805761067f610565565b5b5f61068d84828501610657565b91505092915050565b61069f81610569565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106ce826106a5565b9050919050565b6106de816106c4565b82525050565b5f6060820190506106f75f830186610696565b6107046020830185610696565b61071160408301846106d5565b949350505050565b5f60208201905061072c5f830184610696565b92915050565b61073b81610638565b82525050565b5f6020820190506107545f830184610732565b92915050565b5f82825260208201905092915050565b7f454d5054595f4e414d45000000000000000000000000000000000000000000005f82015250565b5f61079e600a8361075a565b91506107a98261076a565b602082019050919050565b5f6020820190508181035f8301526107cb81610792565b9050919050565b7f4455504c49434154455f4e414d450000000000000000000000000000000000005f82015250565b5f610806600e8361075a565b9150610811826107d2565b602082019050919050565b5f6020820190508181035f830152610833816107fa565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e4f545f464f554e4400000000000000000000000000000000000000000000005f82015250565b5f61089b60098361075a565b91506108a682610867565b602082019050919050565b5f6020820190508181035f8301526108c88161088f565b905091905056", + "nonce": "0x4b", "chainId": "0x13882" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x91d1a182d51eec2cfed1d2e3c037a6a810f616b2ed42310b048bbd920daa655e", + "hash": "0x94deaec6aaa037d9de3dd41baebcd9eb515c6249ffdeff3a6eb49a4440c26498", "transactionType": "CREATE2", - "contractName": "TheGuildBadgeRegistry", - "contractAddress": "0x8ac95734e778322684f1d318fb7633777baa8427", + "contractName": "TheGuildAttestationResolver", + "contractAddress": "0x8b481fb56b133b590348b2b3b1d3ae2fce0d4324", "function": null, - "arguments": null, + "arguments": [ + "0xb101275a60d8bfb14529C421899aD7CA1Ae5B5Fc", + "0x4649490B118389d0Be8F48b8953eFb235d8CB545", + "0x94f5F12BE60a338D263882a1A49E81ca8A0c30F4" + ], "transaction": { "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "gas": "0xc0d57", + "gas": "0x229d10", + "value": "0x0", + "input": "0x7468656775696c645f765f302e312e3300000000000000000000000000000000610100604052348015610010575f5ffd5b50604051611cf4380380611cf483398181016040528101906100329190610259565b82600160045f82608081815250508160a081815250508060c081815250505050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100b8576040517f83780ffe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff168152505050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506102a9565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101a182610178565b9050919050565b5f6101b282610197565b9050919050565b6101c2816101a8565b81146101cc575f5ffd5b50565b5f815190506101dd816101b9565b92915050565b5f6101ed82610197565b9050919050565b6101fd816101e3565b8114610207575f5ffd5b50565b5f81519050610218816101f4565b92915050565b5f61022882610197565b9050919050565b6102388161021e565b8114610242575f5ffd5b50565b5f815190506102538161022f565b92915050565b5f5f5f606084860312156102705761026f610174565b5b5f61027d868287016101cf565b935050602061028e8682870161020a565b925050604061029f86828701610245565b9150509250925092565b60805160a05160c05160e051611a116102e35f395f818161052701526106e301525f6102a101525f61027801525f61024f0152611a115ff3fe60806040526004361061007e575f3560e01c80639df97fd71161004d5780639df97fd71461017b578063ce46e046146101b7578063e49617e1146101e1578063e60c350514610211576100c3565b806354fd4d50146100c757806388e5b2d9146100f157806391db0b7e14610121578063962ea8ae14610151576100c3565b366100c35761008b610241565b6100c1576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f5ffd5b3480156100d2575f5ffd5b506100db610248565b6040516100e89190610caf565b60405180910390f35b61010b60048036038101906101069190610d96565b6102eb565b6040516101189190610e2e565b60405180910390f35b61013b60048036038101906101369190610d96565b6103fe565b6040516101489190610e2e565b60405180910390f35b34801561015c575f5ffd5b50610165610511565b6040516101729190610e5f565b60405180910390f35b348015610186575f5ffd5b506101a1600480360381019061019c9190610ea2565b61051d565b6040516101ae919061107e565b60405180910390f35b3480156101c2575f5ffd5b506101cb610241565b6040516101d89190610e2e565b60405180910390f35b6101fb60048036038101906101f691906110c1565b6105e3565b6040516102089190610e2e565b60405180910390f35b61022b600480360381019061022691906110c1565b6105fd565b6040516102389190610e2e565b60405180910390f35b5f5f905090565b60606102737f0000000000000000000000000000000000000000000000000000000000000000610617565b61029c7f0000000000000000000000000000000000000000000000000000000000000000610617565b6102c57f0000000000000000000000000000000000000000000000000000000000000000610617565b6040516020016102d79392919061118c565b604051602081830303815290604052905090565b5f6102f46106e1565b5f858590509050838390508114610337576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f3490505f5f90505b828110156103ee575f86868381811061035c5761035b6111d2565b5b9050602002013590508281111561039f576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6103cd8989848181106103b5576103b46111d2565b5b90506020028101906103c7919061120b565b82610768565b6103dd575f9450505050506103f6565b808303925050806001019050610340565b506001925050505b949350505050565b5f6104076106e1565b5f85859050905083839050811461044a576040517f947d5a8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f3490505f5f90505b82811015610501575f86868381811061046f5761046e6111d2565b5b905060200201359050828111156104b2576040517f1101129400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104e08989848181106104c8576104c76111d2565b5b90506020028101906104da919061120b565b82610773565b6104f0575f945050505050610509565b808303925050806001019050610453565b506001925050505b949350505050565b5f600280549050905090565b610525610ba9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a3112a6460028481548110610575576105746111d2565b5b905f5260205f2001546040518263ffffffff1660e01b815260040161059a9190611242565b5f60405180830381865afa1580156105b4573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906105dc9190611534565b9050919050565b5f6105ec6106e1565b6105f68234610768565b9050919050565b5f6106066106e1565b6106108234610773565b9050919050565b60605f600161062584610a58565b0190505f8167ffffffffffffffff8111156106435761064261125f565b5b6040519080825280601f01601f1916602001820160405280156106755781602001600182028036833780820191505090505b5090505f82602083010190505b6001156106d6578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816106cb576106ca61157b565b5b0494505f8503610682575b819350505050919050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610766576040517f4ca8886700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f6001905092915050565b5f5f8380610120019061078691906115a8565b810190610793919061169a565b50905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338a699a4826040518263ffffffff1660e01b81526004016107f09190611242565b602060405180830381865afa15801561080b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f91906116f4565b61083c575f915050610a52565b5f8460e00160208101906108509190611733565b8560c00160208101906108639190611733565b836040516020016108769392919061176d565b60405160208183030381529060405280519060200120905060035f8281526020019081526020015f205f9054906101000a900460ff16156108bb575f92505050610a52565b600160035f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055505f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f198660e00160208101906109339190611733565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561099c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c091906117d8565b600a6109cc919061195f565b600a6109d891906119a9565b6040518363ffffffff1660e01b81526004016109f59291906119ea565b5f604051808303815f87803b158015610a0c575f5ffd5b505af1158015610a1e573d5f5f3e3d5ffd5b505050506002855f0135908060018154018082558091505060019003905f5260205f20015f90919091909150556001925050505b92915050565b5f5f5f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310610ab4577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381610aaa57610aa961157b565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310610af1576d04ee2d6d415b85acef81000000008381610ae757610ae661157b565b5b0492506020810190505b662386f26fc100008310610b2057662386f26fc100008381610b1657610b1561157b565b5b0492506010810190505b6305f5e1008310610b49576305f5e1008381610b3f57610b3e61157b565b5b0492506008810190505b6127108310610b6e576127108381610b6457610b6361157b565b5b0492506004810190505b60648310610b915760648381610b8757610b8661157b565b5b0492506002810190505b600a8310610ba0576001810190505b80915050919050565b6040518061014001604052805f81526020015f81526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f67ffffffffffffffff1681526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f15158152602001606081525090565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610c8182610c3f565b610c8b8185610c49565b9350610c9b818560208601610c59565b610ca481610c67565b840191505092915050565b5f6020820190508181035f830152610cc78184610c77565b905092915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f840112610d0157610d00610ce0565b5b8235905067ffffffffffffffff811115610d1e57610d1d610ce4565b5b602083019150836020820283011115610d3a57610d39610ce8565b5b9250929050565b5f5f83601f840112610d5657610d55610ce0565b5b8235905067ffffffffffffffff811115610d7357610d72610ce4565b5b602083019150836020820283011115610d8f57610d8e610ce8565b5b9250929050565b5f5f5f5f60408587031215610dae57610dad610cd8565b5b5f85013567ffffffffffffffff811115610dcb57610dca610cdc565b5b610dd787828801610cec565b9450945050602085013567ffffffffffffffff811115610dfa57610df9610cdc565b5b610e0687828801610d41565b925092505092959194509250565b5f8115159050919050565b610e2881610e14565b82525050565b5f602082019050610e415f830184610e1f565b92915050565b5f819050919050565b610e5981610e47565b82525050565b5f602082019050610e725f830184610e50565b92915050565b610e8181610e47565b8114610e8b575f5ffd5b50565b5f81359050610e9c81610e78565b92915050565b5f60208284031215610eb757610eb6610cd8565b5b5f610ec484828501610e8e565b91505092915050565b5f819050919050565b610edf81610ecd565b82525050565b5f67ffffffffffffffff82169050919050565b610f0181610ee5565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610f3082610f07565b9050919050565b610f4081610f26565b82525050565b610f4f81610e14565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f610f7982610f55565b610f838185610f5f565b9350610f93818560208601610c59565b610f9c81610c67565b840191505092915050565b5f61014083015f830151610fbd5f860182610ed6565b506020830151610fd06020860182610ed6565b506040830151610fe36040860182610ef8565b506060830151610ff66060860182610ef8565b5060808301516110096080860182610ef8565b5060a083015161101c60a0860182610ed6565b5060c083015161102f60c0860182610f37565b5060e083015161104260e0860182610f37565b50610100830151611057610100860182610f46565b506101208301518482036101208601526110718282610f6f565b9150508091505092915050565b5f6020820190508181035f8301526110968184610fa7565b905092915050565b5f5ffd5b5f61014082840312156110b8576110b761109e565b5b81905092915050565b5f602082840312156110d6576110d5610cd8565b5b5f82013567ffffffffffffffff8111156110f3576110f2610cdc565b5b6110ff848285016110a2565b91505092915050565b5f81905092915050565b5f61111c82610c3f565b6111268185611108565b9350611136818560208601610c59565b80840191505092915050565b7f2e000000000000000000000000000000000000000000000000000000000000005f82015250565b5f611176600183611108565b915061118182611142565b600182019050919050565b5f6111978286611112565b91506111a28261116a565b91506111ae8285611112565b91506111b98261116a565b91506111c58284611112565b9150819050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f5ffd5b5f5ffd5b5f5ffd5b5f8235600161014003833603038112611227576112266111ff565b5b80830191505092915050565b61123c81610ecd565b82525050565b5f6020820190506112555f830184611233565b92915050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61129582610c67565b810181811067ffffffffffffffff821117156112b4576112b361125f565b5b80604052505050565b5f6112c6610ccf565b90506112d2828261128c565b919050565b5f5ffd5b6112e481610ecd565b81146112ee575f5ffd5b50565b5f815190506112ff816112db565b92915050565b61130e81610ee5565b8114611318575f5ffd5b50565b5f8151905061132981611305565b92915050565b61133881610f26565b8114611342575f5ffd5b50565b5f815190506113538161132f565b92915050565b61136281610e14565b811461136c575f5ffd5b50565b5f8151905061137d81611359565b92915050565b5f5ffd5b5f67ffffffffffffffff8211156113a1576113a061125f565b5b6113aa82610c67565b9050602081019050919050565b5f6113c96113c484611387565b6112bd565b9050828152602081018484840111156113e5576113e4611383565b5b6113f0848285610c59565b509392505050565b5f82601f83011261140c5761140b610ce0565b5b815161141c8482602086016113b7565b91505092915050565b5f610140828403121561143b5761143a61125b565b5b6114466101406112bd565b90505f611455848285016112f1565b5f830152506020611468848285016112f1565b602083015250604061147c8482850161131b565b60408301525060606114908482850161131b565b60608301525060806114a48482850161131b565b60808301525060a06114b8848285016112f1565b60a08301525060c06114cc84828501611345565b60c08301525060e06114e084828501611345565b60e0830152506101006114f58482850161136f565b6101008301525061012082015167ffffffffffffffff81111561151b5761151a6112d7565b5b611527848285016113f8565b6101208301525092915050565b5f6020828403121561154957611548610cd8565b5b5f82015167ffffffffffffffff81111561156657611565610cdc565b5b61157284828501611425565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f5f833560016020038436030381126115c4576115c36111ff565b5b80840192508235915067ffffffffffffffff8211156115e6576115e5611203565b5b60208301925060018202360383131561160257611601611207565b5b509250929050565b5f81359050611618816112db565b92915050565b828183375f83830152505050565b5f61163e61163984611387565b6112bd565b90508281526020810184848401111561165a57611659611383565b5b61166584828561161e565b509392505050565b5f82601f83011261168157611680610ce0565b5b813561169184826020860161162c565b91505092915050565b5f5f604083850312156116b0576116af610cd8565b5b5f6116bd8582860161160a565b925050602083013567ffffffffffffffff8111156116de576116dd610cdc565b5b6116ea8582860161166d565b9150509250929050565b5f6020828403121561170957611708610cd8565b5b5f6117168482850161136f565b91505092915050565b5f8135905061172d8161132f565b92915050565b5f6020828403121561174857611747610cd8565b5b5f6117558482850161171f565b91505092915050565b61176781610f26565b82525050565b5f6060820190506117805f83018661175e565b61178d602083018561175e565b61179a6040830184611233565b949350505050565b5f60ff82169050919050565b6117b7816117a2565b81146117c1575f5ffd5b50565b5f815190506117d2816117ae565b92915050565b5f602082840312156117ed576117ec610cd8565b5b5f6117fa848285016117c4565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f5f8291508390505b60018511156118855780860481111561186157611860611803565b5b60018516156118705780820291505b808102905061187e85611830565b9450611845565b94509492505050565b5f8261189d5760019050611958565b816118aa575f9050611958565b81600181146118c057600281146118ca576118f9565b6001915050611958565b60ff8411156118dc576118db611803565b5b8360020a9150848211156118f3576118f2611803565b5b50611958565b5060208310610133831016604e8410600b841016171561192e5782820a90508381111561192957611928611803565b5b611958565b61193b848484600161183c565b9250905081840481111561195257611951611803565b5b81810290505b9392505050565b5f61196982610e47565b9150611974836117a2565b92506119a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461188e565b905092915050565b5f6119b382610e47565b91506119be83610e47565b92508282026119cc81610e47565b915082820484148315176119e3576119e2611803565b5b5092915050565b5f6040820190506119fd5f83018561175e565b611a0a6020830184610e50565b939250505056000000000000000000000000b101275a60d8bfb14529c421899ad7ca1ae5b5fc0000000000000000000000004649490b118389d0be8f48b8953efb235d8cb54500000000000000000000000094f5f12be60a338d263882a1a49e81ca8a0c30f4", + "nonce": "0x4c", + "chainId": "0x13882" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xbb3b1c2030c8a76f9742eda835a3e011e257b8c001b5956438834bfc0db7556f", + "transactionType": "CALL", + "contractName": "TheGuildActivityToken", + "contractAddress": "0x4649490b118389d0be8f48b8953efb235d8cb545", + "function": "transferOwnership(address)", + "arguments": [ + "0x8B481fB56b133b590348B2B3B1D3Ae2fce0D4324" + ], + "transaction": { + "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", + "to": "0x4649490b118389d0be8f48b8953efb235d8cb545", + "gas": "0xa5f6", + "value": "0x0", + "input": "0xf2fde38b0000000000000000000000008b481fb56b133b590348b2b3b1d3ae2fce0d4324", + "nonce": "0x4d", + "chainId": "0x13882" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xdd692eacd075605cb97c087b7802b46847cf88aa49fb8f74acf51875445d48f4", + "transactionType": "CALL", + "contractName": "SchemaRegistry", + "contractAddress": "0x23c5701a1bda89c61d181bd79e5203c730708ae7", + "function": "register(string,address,bool)", + "arguments": [ + "bytes32 badgeName, bytes justification", + "0x8B481fB56b133b590348B2B3B1D3Ae2fce0D4324", + "true" + ], + "transaction": { + "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", + "to": "0x23c5701a1bda89c61d181bd79e5203c730708ae7", + "gas": "0x31ccb", "value": "0x0", - "input": "0x7468656775696c645f765f302e312e315f6465760000000000000000000000006080604052348015600e575f5ffd5b506108cf8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610060575f3560e01c80633580dbc71461006457806338a699a4146100805780634d3c901d146100b057806377002fcf146100e257806381407b1b14610114578063a490a69714610144575b5f5ffd5b61007e6004803603810190610079919061059c565b610162565b005b61009a600480360381019061009591906105da565b610346565b6040516100a7919061061f565b60405180910390f35b6100ca60048036038101906100c5919061066b565b61036c565b6040516100d9939291906106e4565b60405180910390f35b6100fc60048036038101906100f791906105da565b610432565b60405161010b939291906106e4565b60405180910390f35b61012e6004803603810190610129919061066b565b610534565b60405161013b9190610719565b60405180910390f35b61014c610559565b6040516101599190610741565b60405180910390f35b5f5f1b82036101a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019d906107b4565b60405180910390fd5b60015f8381526020019081526020015f205f9054906101000a900460ff1615610204576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101fb9061081c565b60405180910390fd5b5f60405180606001604052808481526020018381526020013373ffffffffffffffffffffffffffffffffffffffff168152509050805f5f8581526020019081526020015f205f820151815f0155602082015181600101556040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506001805f8581526020019081526020015f205f6101000a81548160ff021916908315150217905550600283908060018154018082558091505060019003905f5260205f20015f90919091909150553373ffffffffffffffffffffffffffffffffffffffff16837f7d648d3c718d609c93c086fd770653e10a64c5afe41e0b1b0b4bb76bba24c479846040516103399190610719565b60405180910390a3505050565b5f60015f8381526020019081526020015f205f9054906101000a900460ff169050919050565b5f5f5f5f600285815481106103845761038361083a565b5b905f5260205f20015490505f5f5f8381526020019081526020015f206040518060600160405290815f820154815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050805f01518160200151826040015194509450945050509193909250565b5f5f5f60015f8581526020019081526020015f205f9054906101000a900460ff16610492576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610489906108b1565b60405180910390fd5b5f5f5f8681526020019081526020015f206040518060600160405290815f820154815260200160018201548152602001600282015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250509050805f015181602001518260400151935093509350509193909250565b5f600282815481106105495761054861083a565b5b905f5260205f2001549050919050565b5f600280549050905090565b5f5ffd5b5f819050919050565b61057b81610569565b8114610585575f5ffd5b50565b5f8135905061059681610572565b92915050565b5f5f604083850312156105b2576105b1610565565b5b5f6105bf85828601610588565b92505060206105d085828601610588565b9150509250929050565b5f602082840312156105ef576105ee610565565b5b5f6105fc84828501610588565b91505092915050565b5f8115159050919050565b61061981610605565b82525050565b5f6020820190506106325f830184610610565b92915050565b5f819050919050565b61064a81610638565b8114610654575f5ffd5b50565b5f8135905061066581610641565b92915050565b5f602082840312156106805761067f610565565b5b5f61068d84828501610657565b91505092915050565b61069f81610569565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106ce826106a5565b9050919050565b6106de816106c4565b82525050565b5f6060820190506106f75f830186610696565b6107046020830185610696565b61071160408301846106d5565b949350505050565b5f60208201905061072c5f830184610696565b92915050565b61073b81610638565b82525050565b5f6020820190506107545f830184610732565b92915050565b5f82825260208201905092915050565b7f454d5054595f4e414d45000000000000000000000000000000000000000000005f82015250565b5f61079e600a8361075a565b91506107a98261076a565b602082019050919050565b5f6020820190508181035f8301526107cb81610792565b9050919050565b7f4455504c49434154455f4e414d450000000000000000000000000000000000005f82015250565b5f610806600e8361075a565b9150610811826107d2565b602082019050919050565b5f6020820190508181035f830152610833816107fa565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e4f545f464f554e4400000000000000000000000000000000000000000000005f82015250565b5f61089b60098361075a565b91506108a682610867565b602082019050919050565b5f6020820190508181035f8301526108c88161088f565b905091905056", - "nonce": "0x43", + "input": "0x60d7a27800000000000000000000000000000000000000000000000000000000000000600000000000000000000000008b481fb56b133b590348b2b3b1d3ae2fce0d432400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000026627974657333322062616467654e616d652c206279746573206a757374696669636174696f6e0000000000000000000000000000000000000000000000000000", + "nonce": "0x4e", "chainId": "0x13882" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x9a8b2d62bdb7beb0d5cebc1fca95834566dec09eab88809c03bd72fa08cec238", + "hash": "0x86f4af9f6ab97a78528bf72757fc0ffcda86c4dac1dfab1e0ff6338f2df634ac", "transactionType": "CALL", "contractName": "TheGuildBadgeRegistry", - "contractAddress": "0x8ac95734e778322684f1d318fb7633777baa8427", + "contractAddress": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "function": "createBadge(bytes32,bytes32)", "arguments": [ "0x5275737400000000000000000000000000000000000000000000000000000000", @@ -75,21 +119,21 @@ ], "transaction": { "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", - "to": "0x8ac95734e778322684f1d318fb7633777baa8427", + "to": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "gas": "0x3842f", "value": "0x0", "input": "0x3580dbc752757374000000000000000000000000000000000000000000000000000000004b6e6f7720686f7720746f20636f646520696e20527573740000000000000000", - "nonce": "0x44", + "nonce": "0x4f", "chainId": "0x13882" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x531814622877a2662f75eeaf96e5f3bcc303c9f18a3f048feac34ffba955335c", + "hash": "0x8fb85f2b92b97755a0fb270f1e796d8ba117c614b88df43ae96636eb7870779a", "transactionType": "CALL", "contractName": "TheGuildBadgeRegistry", - "contractAddress": "0x8ac95734e778322684f1d318fb7633777baa8427", + "contractAddress": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "function": "createBadge(bytes32,bytes32)", "arguments": [ "0x536f6c6964697479000000000000000000000000000000000000000000000000", @@ -97,21 +141,21 @@ ], "transaction": { "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", - "to": "0x8ac95734e778322684f1d318fb7633777baa8427", + "to": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "gas": "0x2f66d", "value": "0x0", "input": "0x3580dbc7536f6c69646974790000000000000000000000000000000000000000000000004b6e6f7720686f7720746f20636f646520696e20536f6c696469747900000000", - "nonce": "0x45", + "nonce": "0x50", "chainId": "0x13882" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x74e4646a30f8e612a910ca8c67b7043fd5fbe2ddfa037fe32f587c0ac056a259", + "hash": "0x77b17b5c357de698a208737e19b7dd5799037d9443c24588a4c8b03d6b7f5999", "transactionType": "CALL", "contractName": "TheGuildBadgeRegistry", - "contractAddress": "0x8ac95734e778322684f1d318fb7633777baa8427", + "contractAddress": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "function": "createBadge(bytes32,bytes32)", "arguments": [ "0x5479706553637269707400000000000000000000000000000000000000000000", @@ -119,32 +163,53 @@ ], "transaction": { "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", - "to": "0x8ac95734e778322684f1d318fb7633777baa8427", + "to": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "gas": "0x2f6af", "value": "0x0", "input": "0x3580dbc754797065536372697074000000000000000000000000000000000000000000004b6e6f7720686f7720746f20636f646520696e20547970655363726970740000", - "nonce": "0x46", + "nonce": "0x51", + "chainId": "0x13882" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x2f800dfe1dbd156bfe12dd57e80ab841cf0a5024c9ed962823d295faebd449b0", + "transactionType": "CREATE2", + "contractName": "TheGuildBadgeRanking", + "contractAddress": "0x435576dfa5b151a6a1c8a4b5eddfb4ceed5a55af", + "function": null, + "arguments": [ + "0x94f5F12BE60a338D263882a1A49E81ca8A0c30F4" + ], + "transaction": { + "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0xb6a22", + "value": "0x0", + "input": "0x7468656775696c645f765f302e312e3300000000000000000000000000000000608060405234801561000f575f5ffd5b506040516109bf3803806109bf83398181016040528101906100319190610153565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361009f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610096906101d8565b60405180910390fd5b805f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101f6565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610111826100e8565b9050919050565b5f61012282610107565b9050919050565b61013281610118565b811461013c575f5ffd5b50565b5f8151905061014d81610129565b92915050565b5f60208284031215610168576101676100e4565b5b5f6101758482850161013f565b91505092915050565b5f82825260208201905092915050565b7f494e56414c49445f5245474953545259000000000000000000000000000000005f82015250565b5f6101c260108361017e565b91506101cd8261018e565b602082019050919050565b5f6020820190508181035f8301526101ef816101b6565b9050919050565b6107bc806102035f395ff3fe608060405234801561000f575f5ffd5b5060043610610055575f3560e01c806387f7ee2f14610059578063ce4a0a2d14610089578063d9437ba1146100b9578063e7f76a30146100d5578063ea3e7cef14610105575b5f5ffd5b610073600480360381019061006e91906104aa565b610123565b6040516100809190610502565b60405180910390f35b6100a3600480360381019061009e919061051b565b610185565b6040516100b0919061055e565b60405180910390f35b6100d360048036038101906100ce919061051b565b61019a565b005b6100ef60048036038101906100ea919061051b565b6103db565b6040516100fc919061055e565b60405180910390f35b61010d6103f5565b60405161011a91906105d2565b60405180910390f35b5f60025f8481526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6001602052805f5260405f205f915090505481565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338a699a4826040518263ffffffff1660e01b81526004016101f391906105fa565b602060405180830381865afa15801561020e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610232919061063d565b610271576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610268906106c2565b60405180910390fd5b60025f8281526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561030a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103019061072a565b60405180910390fd5b600160025f8381526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060015f8281526020019081526020015f205f81548092919061038f90610775565b91905055503373ffffffffffffffffffffffffffffffffffffffff16817fa0379dc3dcf5bd833ffd3dc48c2af12c226c21cbf7d47a3a157519ab0fe9ea6a60405160405180910390a350565b5f60015f8381526020019081526020015f20549050919050565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5ffd5b5f819050919050565b61042f8161041d565b8114610439575f5ffd5b50565b5f8135905061044a81610426565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61047982610450565b9050919050565b6104898161046f565b8114610493575f5ffd5b50565b5f813590506104a481610480565b92915050565b5f5f604083850312156104c0576104bf610419565b5b5f6104cd8582860161043c565b92505060206104de85828601610496565b9150509250929050565b5f8115159050919050565b6104fc816104e8565b82525050565b5f6020820190506105155f8301846104f3565b92915050565b5f602082840312156105305761052f610419565b5b5f61053d8482850161043c565b91505092915050565b5f819050919050565b61055881610546565b82525050565b5f6020820190506105715f83018461054f565b92915050565b5f819050919050565b5f61059a61059561059084610450565b610577565b610450565b9050919050565b5f6105ab82610580565b9050919050565b5f6105bc826105a1565b9050919050565b6105cc816105b2565b82525050565b5f6020820190506105e55f8301846105c3565b92915050565b6105f48161041d565b82525050565b5f60208201905061060d5f8301846105eb565b92915050565b61061c816104e8565b8114610626575f5ffd5b50565b5f8151905061063781610613565b92915050565b5f6020828403121561065257610651610419565b5b5f61065f84828501610629565b91505092915050565b5f82825260208201905092915050565b7f42414447455f4e4f545f464f554e4400000000000000000000000000000000005f82015250565b5f6106ac600f83610668565b91506106b782610678565b602082019050919050565b5f6020820190508181035f8301526106d9816106a0565b9050919050565b7f414c52454144595f564f544544000000000000000000000000000000000000005f82015250565b5f610714600d83610668565b915061071f826106e0565b602082019050919050565b5f6020820190508181035f83015261074181610708565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61077f82610546565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036107b1576107b0610748565b5b6001820190509190505600000000000000000000000094f5f12be60a338d263882a1a49e81ca8a0c30f4", + "nonce": "0x52", "chainId": "0x13882" }, "additionalContracts": [], "isFixedGasLimit": false }, { - "hash": "0x171095263c193fdb04cc9fc18a2254dd8460aa2119baca2525db9aaada2fcf3e", + "hash": "0x7b85ac16958cee6192204c8b5e32d41b4cc32c9ac7949132a6d867a330e3622e", "transactionType": "CALL", "contractName": "EAS", "contractAddress": "0xb101275a60d8bfb14529c421899ad7ca1ae5b5fc", "function": "attest((bytes32,(address,uint64,bool,bytes32,bytes,uint256)))", "arguments": [ - "(0x8ef2fdb896e42534302cc992c2b2daf614ccabf3fc6d78ce15dc35534b8fa481, (0x6cfD0753EC4da15Dcb418E11e921C0665c1d1cBf, 0, true, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x5275737400000000000000000000000000000000000000000000000000000000536177207468656d20636f64696e6720696e2052757374000000000000000000, 0))" + "(0xbcd7561083784f9b5a1c2b3ddb7aa9db263d43c58f7374cfa4875646824a47de, (0x6cfD0753EC4da15Dcb418E11e921C0665c1d1cBf, 0, true, 0x0000000000000000000000000000000000000000000000000000000000000000, 0x527573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000017536177207468656d20636f64696e6720696e2052757374000000000000000000, 0))" ], "transaction": { "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "to": "0xb101275a60d8bfb14529c421899ad7ca1ae5b5fc", - "gas": "0x6d1d8", + "gas": "0x92a44", "value": "0x0", - "input": "0xf17325e700000000000000000000000000000000000000000000000000000000000000208ef2fdb896e42534302cc992c2b2daf614ccabf3fc6d78ce15dc35534b8fa48100000000000000000000000000000000000000000000000000000000000000400000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000405275737400000000000000000000000000000000000000000000000000000000536177207468656d20636f64696e6720696e2052757374000000000000000000", - "nonce": "0x47", + "input": "0xf17325e70000000000000000000000000000000000000000000000000000000000000020bcd7561083784f9b5a1c2b3ddb7aa9db263d43c58f7374cfa4875646824a47de00000000000000000000000000000000000000000000000000000000000000400000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080527573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000017536177207468656d20636f64696e6720696e2052757374000000000000000000", + "nonce": "0x53", "chainId": "0x13882" }, "additionalContracts": [], @@ -154,19 +219,20 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0x215885", + "cumulativeGasUsed": "0x107a6a", "logs": [ { - "address": "0x82eba5400b4e914a9b5e4573867b9a73c488c1ed", + "address": "0x4649490b118389d0be8f48b8953efb235d8cb545", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c" + "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf" ], "data": "0x", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0xd472cbae6067f95ea976a9dcd83ac4d2eda56eb697900c75e8a7188829366019", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0xef9d70568de2281d3f3471667de3ab255534c523fcebe779a2d423720b604880", "transactionIndex": "0x0", "logIndex": "0x0", "removed": false @@ -179,46 +245,66 @@ "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0" ], - "data": "0x000000000000000000000000000000000000000000000000106f102213aa586300000000000000000000000000000000000000000000000548ef177523734b8f0000000000000000000000000000000000000000000001f7c830d2518cb5e67d000000000000000000000000000000000000000000000005388007530fc8f32c0000000000000000000000000000000000000000000001f7d89fe273a0603ee0", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0xd472cbae6067f95ea976a9dcd83ac4d2eda56eb697900c75e8a7188829366019", + "data": "0x00000000000000000000000000000000000000000000000000bfd4cd95e608000000000000000000000000000000000000000000000000052d62726b142d3ff900000000000000000000000000000000000000000000093c1fe98de091f4a3020000000000000000000000000000000000000000000000052ca29d9d7e4737f900000000000000000000000000000000000000000000093c20a962ae27daab02", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0xef9d70568de2281d3f3471667de3ab255534c523fcebe779a2d423720b604880", "transactionIndex": "0x0", "logIndex": "0x1", "removed": false } ], - "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000000000000000000000000010000000000008000000000000000000000000000000000001000000000000000000000800001000000000000000500000000000000000000020000000000000000000800000000000000000080000000000000400000000000000000020000000400000000000000001100000000000000000000200000000001000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000400000000000300000000020000000000000000000000000000000000080000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000800000000000000004000000000000000000010040000000008000000000000000000000000000000000000000000000000000000000800001000000000000000100000000000000000000020000000000000000000800000000000000000080000800000000400000000000000000020000000400000000000000000100000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000400000000000300000000020000000000000000000000000000000000000000000000000000000000000100000", "type": "0x2", - "transactionHash": "0xd472cbae6067f95ea976a9dcd83ac4d2eda56eb697900c75e8a7188829366019", + "transactionHash": "0xef9d70568de2281d3f3471667de3ab255534c523fcebe779a2d423720b604880", "transactionIndex": "0x0", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "gasUsed": "0x215885", - "effectiveGasPrice": "0x7e2a2f3606", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "gasUsed": "0x107a6a", + "effectiveGasPrice": "0xba43b743f", "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "contractAddress": "0x82eba5400b4e914a9b5e4573867b9a73c488c1ed" + "contractAddress": "0x4649490b118389d0be8f48b8953efb235d8cb545" }, { "status": "0x1", - "cumulativeGasUsed": "0x23796e", + "cumulativeGasUsed": "0x18b7dd", "logs": [ { - "address": "0x23c5701a1bda89c61d181bd79e5203c730708ae7", + "address": "0x0000000000000000000000000000000000001010", "topics": [ - "0xd0b86852e21f9e5fa4bc3b0cff9757ffe243d50c4b43968a42202153d651ea5e", - "0x8ef2fdb896e42534302cc992c2b2daf614ccabf3fc6d78ce15dc35534b8fa481", - "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf" + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", + "0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0" ], - "data": "0x00000000000000000000000000000000000000000000000000000000000000208ef2fdb896e42534302cc992c2b2daf614ccabf3fc6d78ce15dc35534b8fa48100000000000000000000000082eba5400b4e914a9b5e4573867b9a73c488c1ed000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000028627974657333322062616467654e616d652c2062797465733332206a757374696669636174696f6e000000000000000000000000000000000000000000000000", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x155e08489676344c298734508d8f8ffd467da20c6743c6b345d2006da07f6c1e", + "data": "0x000000000000000000000000000000000000000000000000005fed3891591c000000000000000000000000000000000000000000000000052ca29d9d7a3917e300000000000000000000000000000000000000000000093c20a962ae27daab020000000000000000000000000000000000000000000000052c42b064e8dffbe300000000000000000000000000000000000000000000093c21094fe6b933c702", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x1441a182605be12251f5006f3955f7dcfce6426aa817983cc52511a8cce52a45", "transactionIndex": "0x1", "logIndex": "0x2", "removed": false - }, + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000020000000400000000000000000100000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000400000000000300000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x1441a182605be12251f5006f3955f7dcfce6426aa817983cc52511a8cce52a45", + "transactionIndex": "0x1", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "gasUsed": "0x83d73", + "effectiveGasPrice": "0xba43b743f", + "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x3062b6", + "logs": [ { "address": "0x0000000000000000000000000000000000001010", "topics": [ @@ -227,31 +313,98 @@ "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0" ], - "data": "0x000000000000000000000000000000000000000000000000010c8c78b73ed21f0000000000000000000000000000000000000000000000053880075307942a710000000000000000000000000000000000000000000001f7d89fe273a0603ee000000000000000000000000000000000000000000000000537737ada505558520000000000000000000000000000000000000000000001f7d9ac6eec579f10ff", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x155e08489676344c298734508d8f8ffd467da20c6743c6b345d2006da07f6c1e", - "transactionIndex": "0x1", + "data": "0x000000000000000000000000000000000000000000000000011386451d6d54000000000000000000000000000000000000000000000000052c42b064e6d8dc9600000000000000000000000000000000000000000000093c21094fe6b933c7020000000000000000000000000000000000000000000000052b2f2a1fc96b889600000000000000000000000000000000000000000000093c221cd62bd6a11b02", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x94deaec6aaa037d9de3dd41baebcd9eb515c6249ffdeff3a6eb49a4440c26498", + "transactionIndex": "0x2", "logIndex": "0x3", "removed": false } ], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000800004000000000000000000000010000000000008000000000000020000000000000000000000040000000000000000000800000000000000000000100000000000000000000000000000000000000000000000001000000000080000000000000000000000000000000020002000400000000000000000100800000000000000000200000000000000010000000000000000000000000000000000000000000004000000000000000000081000000000000000000400000000000300000000000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000020000000400000000000000000100000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000400000000000300000000000000000000000000000000000000000000000000000000000000000000000100000", "type": "0x2", - "transactionHash": "0x155e08489676344c298734508d8f8ffd467da20c6743c6b345d2006da07f6c1e", - "transactionIndex": "0x1", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "gasUsed": "0x220e9", - "effectiveGasPrice": "0x7e2a2f3606", + "transactionHash": "0x94deaec6aaa037d9de3dd41baebcd9eb515c6249ffdeff3a6eb49a4440c26498", + "transactionIndex": "0x2", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "gasUsed": "0x17aad9", + "effectiveGasPrice": "0xba43b743f", "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", - "to": "0x23c5701a1bda89c61d181bd79e5203c730708ae7", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x8b481fb56b133b590348b2b3b1d3ae2fce0d4324" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x30d431", + "logs": [ + { + "address": "0x4649490b118389d0be8f48b8953efb235d8cb545", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", + "0x0000000000000000000000008b481fb56b133b590348b2b3b1d3ae2fce0d4324" + ], + "data": "0x", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0xbb3b1c2030c8a76f9742eda835a3e011e257b8c001b5956438834bfc0db7556f", + "transactionIndex": "0x3", + "logIndex": "0x4", + "removed": false + }, + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", + "0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0" + ], + "data": "0x0000000000000000000000000000000000000000000000000005291626c4bc000000000000000000000000000000000000000000000000052b2f2a1fc3987d2f00000000000000000000000000000000000000000000093c221cd62bd6a11b020000000000000000000000000000000000000000000000052b2a01099cd3c12f00000000000000000000000000000000000000000000093c2221ff41fd65d702", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0xbb3b1c2030c8a76f9742eda835a3e011e257b8c001b5956438834bfc0db7556f", + "transactionIndex": "0x3", + "logIndex": "0x5", + "removed": false + } + ], + "logsBloom": "0x00000200000000000000000000000000000000000000000000800000000000000004000000000000000000010040000000008000000000000000000000000000000000000000000000000000000000800001000000000000000100000000000000000000000000000000000000000000000000000000000080000800000000400000000000000000020000000400000000000000000100040000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000400000000000300000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0xbb3b1c2030c8a76f9742eda835a3e011e257b8c001b5956438834bfc0db7556f", + "transactionIndex": "0x3", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "gasUsed": "0x717b", + "effectiveGasPrice": "0xba43b743f", + "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", + "to": "0x4649490b118389d0be8f48b8953efb235d8cb545", "contractAddress": null }, { "status": "0x1", - "cumulativeGasUsed": "0x2bb711", + "cumulativeGasUsed": "0x32f502", "logs": [ + { + "address": "0x23c5701a1bda89c61d181bd79e5203c730708ae7", + "topics": [ + "0xd0b86852e21f9e5fa4bc3b0cff9757ffe243d50c4b43968a42202153d651ea5e", + "0xbcd7561083784f9b5a1c2b3ddb7aa9db263d43c58f7374cfa4875646824a47de", + "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000020bcd7561083784f9b5a1c2b3ddb7aa9db263d43c58f7374cfa4875646824a47de0000000000000000000000008b481fb56b133b590348b2b3b1d3ae2fce0d4324000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000026627974657333322062616467654e616d652c206279746573206a757374696669636174696f6e0000000000000000000000000000000000000000000000000000", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0xdd692eacd075605cb97c087b7802b46847cf88aa49fb8f74acf51875445d48f4", + "transactionIndex": "0x4", + "logIndex": "0x6", + "removed": false + }, { "address": "0x0000000000000000000000000000000000001010", "topics": [ @@ -260,44 +413,46 @@ "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0" ], - "data": "0x000000000000000000000000000000000000000000000000040fb1dbca17a8b500000000000000000000000000000000000000000000000537737ada4fcf3efb0000000000000000000000000000000000000000000001f7d9ac6eec579f10ff0000000000000000000000000000000000000000000000053363c8fe85b796460000000000000000000000000000000000000000000001f7ddbc20c821b6b9b4", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x91d1a182d51eec2cfed1d2e3c037a6a810f616b2ed42310b048bbd920daa655e", - "transactionIndex": "0x2", - "logIndex": "0x4", + "data": "0x0000000000000000000000000000000000000000000000000018c67f6b09b4000000000000000000000000000000000000000000000000052b2a01099cb7d3ea00000000000000000000000000000000000000000000093c2221ff41fd65d7020000000000000000000000000000000000000000000000052b113a8a31ae1fea00000000000000000000000000000000000000000000093c223ac5c1686f8b02", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0xdd692eacd075605cb97c087b7802b46847cf88aa49fb8f74acf51875445d48f4", + "transactionIndex": "0x4", + "logIndex": "0x7", "removed": false } ], - "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000020000000400000000000000000100000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000400000000000300000000000000000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000800000000000000000000000000010000100000008000000000000020000000000000000000000040000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000020002000400000000000000000100800000000000000000200000000000000010000000000000000000000000800000000000000000004000000000000000000001000000000000000000400000000000300000000000000000000000000000000000000000000000000000000000000000000000100020", "type": "0x2", - "transactionHash": "0x91d1a182d51eec2cfed1d2e3c037a6a810f616b2ed42310b048bbd920daa655e", - "transactionIndex": "0x2", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "gasUsed": "0x83da3", - "effectiveGasPrice": "0x7e2a2f3606", + "transactionHash": "0xdd692eacd075605cb97c087b7802b46847cf88aa49fb8f74acf51875445d48f4", + "transactionIndex": "0x4", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "gasUsed": "0x220d1", + "effectiveGasPrice": "0xba43b743f", "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", - "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", - "contractAddress": "0x8ac95734e778322684f1d318fb7633777baa8427" + "to": "0x23c5701a1bda89c61d181bd79e5203c730708ae7", + "contractAddress": null }, { "status": "0x1", - "cumulativeGasUsed": "0x2e1e94", + "cumulativeGasUsed": "0x355c85", "logs": [ { - "address": "0x8ac95734e778322684f1d318fb7633777baa8427", + "address": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "topics": [ "0x7d648d3c718d609c93c086fd770653e10a64c5afe41e0b1b0b4bb76bba24c479", "0x5275737400000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf" ], "data": "0x4b6e6f7720686f7720746f20636f646520696e20527573740000000000000000", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x9a8b2d62bdb7beb0d5cebc1fca95834566dec09eab88809c03bd72fa08cec238", - "transactionIndex": "0x3", - "logIndex": "0x5", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x86f4af9f6ab97a78528bf72757fc0ffcda86c4dac1dfab1e0ff6338f2df634ac", + "transactionIndex": "0x5", + "logIndex": "0x8", "removed": false }, { @@ -308,44 +463,46 @@ "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0" ], - "data": "0x000000000000000000000000000000000000000000000000012f57e7005995d50000000000000000000000000000000000000000000000053363c8fe83b06b290000000000000000000000000000000000000000000001f7ddbc20c821b6b9b4000000000000000000000000000000000000000000000005323471178356d5540000000000000000000000000000000000000000000001f7deeb78af22104f89", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x9a8b2d62bdb7beb0d5cebc1fca95834566dec09eab88809c03bd72fa08cec238", - "transactionIndex": "0x3", - "logIndex": "0x6", + "data": "0x000000000000000000000000000000000000000000000000001bfd7fde185c000000000000000000000000000000000000000000000000052b113a8a31280c7b00000000000000000000000000000000000000000000093c223ac5c1686f8b020000000000000000000000000000000000000000000000052af53d0a530fb07b00000000000000000000000000000000000000000000093c2256c3414687e702", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x86f4af9f6ab97a78528bf72757fc0ffcda86c4dac1dfab1e0ff6338f2df634ac", + "transactionIndex": "0x5", + "logIndex": "0x9", "removed": false } ], - "logsBloom": "0x00000000000000000000000000000200000000000000000000000000000000000000000000000000000000010000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000001000000000000000000000000000020000000000000000000000080000000000000400001000000040000020002000400000000000000000100000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000008400000000000300000000000400000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000200000000000000000000000000000000000010000000200000000000010000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000001000000000000000000000000000020000000000000000000000080000000000000000001000000000000020000000400000000000000000100000000000000000000200100000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000008400000000000300000000000400000000000000000000000000000000000000000000000000000000000100000", "type": "0x2", - "transactionHash": "0x9a8b2d62bdb7beb0d5cebc1fca95834566dec09eab88809c03bd72fa08cec238", - "transactionIndex": "0x3", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", + "transactionHash": "0x86f4af9f6ab97a78528bf72757fc0ffcda86c4dac1dfab1e0ff6338f2df634ac", + "transactionIndex": "0x5", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", "gasUsed": "0x26783", - "effectiveGasPrice": "0x7e2a2f3606", + "effectiveGasPrice": "0xba43b743f", "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", - "to": "0x8ac95734e778322684f1d318fb7633777baa8427", + "to": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "contractAddress": null }, { "status": "0x1", - "cumulativeGasUsed": "0x3043ab", + "cumulativeGasUsed": "0x37819c", "logs": [ { - "address": "0x8ac95734e778322684f1d318fb7633777baa8427", + "address": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "topics": [ "0x7d648d3c718d609c93c086fd770653e10a64c5afe41e0b1b0b4bb76bba24c479", "0x536f6c6964697479000000000000000000000000000000000000000000000000", "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf" ], "data": "0x4b6e6f7720686f7720746f20636f646520696e20536f6c696469747900000000", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x531814622877a2662f75eeaf96e5f3bcc303c9f18a3f048feac34ffba955335c", - "transactionIndex": "0x4", - "logIndex": "0x7", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x8fb85f2b92b97755a0fb270f1e796d8ba117c614b88df43ae96636eb7870779a", + "transactionIndex": "0x6", + "logIndex": "0xa", "removed": false }, { @@ -356,44 +513,46 @@ "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0" ], - "data": "0x000000000000000000000000000000000000000000000000010e9bcd089197e10000000000000000000000000000000000000000000000053234711782bf5c170000000000000000000000000000000000000000000001f7deeb78af22104f890000000000000000000000000000000000000000000000053125d54a7a2dc4360000000000000000000000000000000000000000000001f7dffa147c2aa1e76a", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x531814622877a2662f75eeaf96e5f3bcc303c9f18a3f048feac34ffba955335c", - "transactionIndex": "0x4", - "logIndex": "0x8", + "data": "0x0000000000000000000000000000000000000000000000000018f83f411b6c000000000000000000000000000000000000000000000000052af53d0a5278373e00000000000000000000000000000000000000000000093c2256c3414687e7020000000000000000000000000000000000000000000000052adc44cb115ccb3e00000000000000000000000000000000000000000000093c226fbb8087a35302", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x8fb85f2b92b97755a0fb270f1e796d8ba117c614b88df43ae96636eb7870779a", + "transactionIndex": "0x6", + "logIndex": "0xb", "removed": false } ], - "logsBloom": "0x00000000008000000000000000000200000000000000000000000000000000000000000000000000000000010000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000400001000000040000020002000400000000000000000100000000000000000000200000000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000400000000000300000000000400000040000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000008000000000000000000200000000000000000000000000000000000010000000200000000000010000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000001000000000000020000000400000000000000000100000000000000000000200100000000000000000000000000000000000000000000000040000000004000000000000000000001000000000000000000400000000000300000000000400000040000000000000000000000000000000000000000000000000000100000", "type": "0x2", - "transactionHash": "0x531814622877a2662f75eeaf96e5f3bcc303c9f18a3f048feac34ffba955335c", - "transactionIndex": "0x4", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", + "transactionHash": "0x8fb85f2b92b97755a0fb270f1e796d8ba117c614b88df43ae96636eb7870779a", + "transactionIndex": "0x6", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", "gasUsed": "0x22517", - "effectiveGasPrice": "0x7e2a2f3606", + "effectiveGasPrice": "0xba43b743f", "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", - "to": "0x8ac95734e778322684f1d318fb7633777baa8427", + "to": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "contractAddress": null }, { "status": "0x1", - "cumulativeGasUsed": "0x3268f2", + "cumulativeGasUsed": "0x39a6e3", "logs": [ { - "address": "0x8ac95734e778322684f1d318fb7633777baa8427", + "address": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "topics": [ "0x7d648d3c718d609c93c086fd770653e10a64c5afe41e0b1b0b4bb76bba24c479", "0x5479706553637269707400000000000000000000000000000000000000000000", "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf" ], "data": "0x4b6e6f7720686f7720746f20636f646520696e20547970655363726970740000", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x74e4646a30f8e612a910ca8c67b7043fd5fbe2ddfa037fe32f587c0ac056a259", - "transactionIndex": "0x5", - "logIndex": "0x9", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x77b17b5c357de698a208737e19b7dd5799037d9443c24588a4c8b03d6b7f5999", + "transactionIndex": "0x7", + "logIndex": "0xc", "removed": false }, { @@ -404,30 +563,65 @@ "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0" ], - "data": "0x000000000000000000000000000000000000000000000000010eb374f16bad310000000000000000000000000000000000000000000000053125d54a79a6a38d0000000000000000000000000000000000000000000001f7dffa147c2aa1e76a000000000000000000000000000000000000000000000005301721d5883af65c0000000000000000000000000000000000000000000001f7e108c7f11c0d949b", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x74e4646a30f8e612a910ca8c67b7043fd5fbe2ddfa037fe32f587c0ac056a259", - "transactionIndex": "0x5", - "logIndex": "0xa", + "data": "0x0000000000000000000000000000000000000000000000000018fa6e0c412c000000000000000000000000000000000000000000000000052adc44cb10d5aa9500000000000000000000000000000000000000000000093c226fbb8087a353020000000000000000000000000000000000000000000000052ac34a5d04947e9500000000000000000000000000000000000000000000093c2288b5ee93e47f02", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x77b17b5c357de698a208737e19b7dd5799037d9443c24588a4c8b03d6b7f5999", + "transactionIndex": "0x7", + "logIndex": "0xd", "removed": false } ], - "logsBloom": "0x00000000000000000000000000000200000000000000000000000000000000000000000000000000000000010000000000008000000000000000000000000000000000000000000000000000000001800000000000000000000100000000000000000000000000000000000000000000002000000000000080000000000000400001000000040000020002000400000000000000000100000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000400000004000300000000000400000000000000000000000000000000000000000000000000000000000100000", + "logsBloom": "0x00000000000000000000000000000200000000000000000000000000000000000010000000200000000000010000000000008000000000000000000000000000000000000000000000000000000001800000000000000000000100000000000000000000000000000000000000000000002000000000000080000000000000000001000000000000020000000400000000000000000100000000000000000000200100000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000400000004000300000000000400000000000000000000000000000000000000000000000000000000000100000", "type": "0x2", - "transactionHash": "0x74e4646a30f8e612a910ca8c67b7043fd5fbe2ddfa037fe32f587c0ac056a259", - "transactionIndex": "0x5", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", + "transactionHash": "0x77b17b5c357de698a208737e19b7dd5799037d9443c24588a4c8b03d6b7f5999", + "transactionIndex": "0x7", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", "gasUsed": "0x22547", - "effectiveGasPrice": "0x7e2a2f3606", + "effectiveGasPrice": "0xba43b743f", "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", - "to": "0x8ac95734e778322684f1d318fb7633777baa8427", + "to": "0x94f5f12be60a338d263882a1a49e81ca8a0c30f4", "contractAddress": null }, { "status": "0x1", - "cumulativeGasUsed": "0x3758e8", + "cumulativeGasUsed": "0x4174ee", + "logs": [ + { + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", + "0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0" + ], + "data": "0x000000000000000000000000000000000000000000000000005adc4811e5fc000000000000000000000000000000000000000000000000052ac34a5d040d521c00000000000000000000000000000000000000000000093c2288b5ee93e47f020000000000000000000000000000000000000000000000052a686e14f227561c00000000000000000000000000000000000000000000093c22e39236a5ca7b02", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x2f800dfe1dbd156bfe12dd57e80ab841cf0a5024c9ed962823d295faebd449b0", + "transactionIndex": "0x8", + "logIndex": "0xe", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000008000000000000000000000000000000000000000000000000000000000800000000000000000000100000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000020000000400000000000000000100000000000000000000200000000000000000000000000000000000000000000000000000000000004000000000000000000001000000000000000000400000000000300000000000000000000000000000000000000000000000000000000000000000000000100000", + "type": "0x2", + "transactionHash": "0x2f800dfe1dbd156bfe12dd57e80ab841cf0a5024c9ed962823d295faebd449b0", + "transactionIndex": "0x8", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "gasUsed": "0x7ce0b", + "effectiveGasPrice": "0xba43b743f", + "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x435576dfa5b151a6a1c8a4b5eddfb4ceed5a55af" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x47b937", "logs": [ { "address": "0xb101275a60d8bfb14529c421899ad7ca1ae5b5fc", @@ -435,29 +629,31 @@ "0x8bf46bf4cfd674fa735a3d63ec1c9ad4153f033c290341f3a588b75685141b35", "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", - "0x8ef2fdb896e42534302cc992c2b2daf614ccabf3fc6d78ce15dc35534b8fa481" + "0xbcd7561083784f9b5a1c2b3ddb7aa9db263d43c58f7374cfa4875646824a47de" ], - "data": "0x7b3f80aeca4d316d29cf947a6c40c60079d8acf94984240d6e4f89e5a5e612da", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x171095263c193fdb04cc9fc18a2254dd8460aa2119baca2525db9aaada2fcf3e", - "transactionIndex": "0x6", - "logIndex": "0xb", + "data": "0x06f466380bdb9ad8c5bb6f022ac90b93dbbacf4f6fee2276b55964ac2fc53f5e", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x7b85ac16958cee6192204c8b5e32d41b4cc32c9ac7949132a6d867a330e3622e", + "transactionIndex": "0x9", + "logIndex": "0xf", "removed": false }, { - "address": "0x82eba5400b4e914a9b5e4573867b9a73c488c1ed", + "address": "0x4649490b118389d0be8f48b8953efb235d8cb545", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf" ], "data": "0x0000000000000000000000000000000000000000000000008ac7230489e80000", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x171095263c193fdb04cc9fc18a2254dd8460aa2119baca2525db9aaada2fcf3e", - "transactionIndex": "0x6", - "logIndex": "0xc", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x7b85ac16958cee6192204c8b5e32d41b4cc32c9ac7949132a6d867a330e3622e", + "transactionIndex": "0x9", + "logIndex": "0x10", "removed": false }, { @@ -468,23 +664,24 @@ "0x0000000000000000000000006cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "0x0000000000000000000000007ee41d8a25641000661b1ef5e6ae8a00400466b0" ], - "data": "0x000000000000000000000000000000000000000000000000026eeb5b73ae763a000000000000000000000000000000000000000000000005301721d587b3c9e30000000000000000000000000000000000000000000001f7e108c7f11c0d949b0000000000000000000000000000000000000000000000052da8367a140553a90000000000000000000000000000000000000000000001f7e377b34c8fbc0ad5", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "transactionHash": "0x171095263c193fdb04cc9fc18a2254dd8460aa2119baca2525db9aaada2fcf3e", - "transactionIndex": "0x6", - "logIndex": "0xd", + "data": "0x0000000000000000000000000000000000000000000000000048f45657c414000000000000000000000000000000000000000000000000052a686e14f03ba16700000000000000000000000000000000000000000000093c22e39236a5ca7b020000000000000000000000000000000000000000000000052a1f79be98778d6700000000000000000000000000000000000000000000093c232c868cfd8e8f02", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "blockTimestamp": "0x6909fbed", + "transactionHash": "0x7b85ac16958cee6192204c8b5e32d41b4cc32c9ac7949132a6d867a330e3622e", + "transactionIndex": "0x9", + "logIndex": "0x11", "removed": false } ], - "logsBloom": "0x00000000000000000000000040000000000000000000000000000000000008004000000000000000000000010000000000008000000000000000000000000000000000001000000000000009000000800000000000000000000500000000000000000000020000000000000000000800000001000000000080000010000000000000000000000000020000000400000000000000000100000000000000000000200000000000000000000000000000000000000010000000000000000000004000000002000000000081000000000000000000400004000000300000000020000000000000000000000000000000000080000000000000000000000000100004", + "logsBloom": "0x00000000000000000000000040000000000000000000000000000000000008000004000000000000000000010040100000008000000000000000000000000000000000000000000000000009000000800000000000000000000100000000000000000000020000000000000000000800000000000000000080000810000000000000000000000000020000000400000000000000000100000000000000000000200000000000000000000000000000000000000010800000000000000000004000000002000000000001000000000000000000400004000000300000000020000000000000000000000000000000000000000000000000000000000000100024", "type": "0x2", - "transactionHash": "0x171095263c193fdb04cc9fc18a2254dd8460aa2119baca2525db9aaada2fcf3e", - "transactionIndex": "0x6", - "blockHash": "0xecba2aebfdbbf840646d96bb7f46fe86f1cb342decead53701583851f1e9deb1", - "blockNumber": "0x1983357", - "gasUsed": "0x4eff6", - "effectiveGasPrice": "0x7e2a2f3606", + "transactionHash": "0x7b85ac16958cee6192204c8b5e32d41b4cc32c9ac7949132a6d867a330e3622e", + "transactionIndex": "0x9", + "blockHash": "0xdb51c3bacde11d57c781f6bcc1c2dafa11fa049b5ef3a0386f7f9ad0f4141235", + "blockNumber": "0x1b46ef3", + "gasUsed": "0x64449", + "effectiveGasPrice": "0xba43b743f", "from": "0x6cfd0753ec4da15dcb418e11e921c0665c1d1cbf", "to": "0xb101275a60d8bfb14529c421899ad7ca1ae5b5fc", "contractAddress": null @@ -493,7 +690,7 @@ "libraries": [], "pending": [], "returns": {}, - "timestamp": 1758561301380, + "timestamp": 1762262098319, "chain": 80002, - "commit": "afe0bbb" + "commit": "95cd03f" } \ No newline at end of file diff --git a/the-guild-smart-contracts/deployAmoy.sh b/the-guild-smart-contracts/deployAmoy.sh index 4889d61..fb1e4b4 100755 --- a/the-guild-smart-contracts/deployAmoy.sh +++ b/the-guild-smart-contracts/deployAmoy.sh @@ -1,2 +1,22 @@ -source .env -forge script --chain amoy script/FullDeploymentScript.s.sol:FullDeploymentScript --rpc-url $AMOY_RPC_URL --broadcast --verify -vvvv --interactives 1 +#!/usr/bin/env bash +set -euo pipefail + +if [[ -f .env ]]; then + # shellcheck disable=SC1091 + source .env +fi + +if [[ -z "${AMOY_RPC_URL:-}" ]]; then + echo "AMOY_RPC_URL env var is required" >&2 + exit 1 +fi + +if [[ -z "${PRIVATE_KEY:-}" ]]; then + echo "PRIVATE_KEY env var is required for non-interactive deployment" >&2 + exit 1 +fi + +forge script --chain amoy script/FullDeploymentScript.s.sol:FullDeploymentScript \ + --rpc-url "$AMOY_RPC_URL" \ + --private-key "$PRIVATE_KEY" \ + --broadcast --verify -vvvv diff --git a/the-guild-smart-contracts/deployLocal.sh b/the-guild-smart-contracts/deployLocal.sh new file mode 100755 index 0000000..f8590bd --- /dev/null +++ b/the-guild-smart-contracts/deployLocal.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Usage: +# LOCAL_PRIVATE_KEY= AMOY_RPC_URL= ./deployLocal.sh +# +# This script: +# 1) Starts an Anvil local node forking Polygon Amoy (to reuse EAS deployments) +# 2) Runs FullDeploymentScript against the local fork + +if [[ ! -f .env ]]; then + echo ".env not found. Continuing without sourcing." +else + # shellcheck disable=SC1091 + source .env +fi + +RPC_FORK_URL=${AMOY_RPC_URL:-} +if [[ -z "${RPC_FORK_URL}" ]]; then + echo "AMOY_RPC_URL env var is required (RPC endpoint to fork)." >&2 + exit 1 +fi + +LOCAL_PK=${LOCAL_PRIVATE_KEY:-} +if [[ -z "${LOCAL_PK}" ]]; then + echo "LOCAL_PRIVATE_KEY env var is required (used to sign txs on the local fork)." >&2 + exit 1 +fi + +PORT=${LOCAL_ANVIL_PORT:-8545} + +if ! command -v anvil >/dev/null 2>&1; then + echo "anvil not found. Install Foundry (foundryup) first: https://book.getfoundry.sh/" >&2 + exit 1 +fi + +echo "Starting anvil fork of Amoy on http://127.0.0.1:${PORT} ..." +LOG_FILE=".anvil_local_fork.log" +anvil \ + --fork-url "${RPC_FORK_URL}" \ + --chain-id 80002 \ + --port "${PORT}" \ + --block-time 1 \ + --no-storage-caching \ + >"${LOG_FILE}" 2>&1 & +ANVIL_PID=$! +trap 'kill ${ANVIL_PID} >/dev/null 2>&1 || true' EXIT + +# Wait until JSON-RPC responds (up to ~15s) +ATTEMPTS=30 +until curl -sS -X POST \ + -H 'Content-Type: application/json' \ + --data '{"jsonrpc":"2.0","id":1,"method":"web3_clientVersion","params":[]}' \ + "http://127.0.0.1:${PORT}" >/dev/null 2>&1; do + ATTEMPTS=$((ATTEMPTS-1)) + if [[ ${ATTEMPTS} -le 0 ]]; then + echo "Anvil did not become ready on port ${PORT}. Logs:" >&2 + echo "---------------- anvil logs ----------------" >&2 + tail -n 200 "${LOG_FILE}" >&2 || true + echo "-------------------------------------------" >&2 + exit 1 + fi + sleep 0.5 +done + +echo "Running FullDeploymentScript against local fork ..." +forge script script/FullDeploymentScript.s.sol:FullDeploymentScript \ + --rpc-url "http://127.0.0.1:${PORT}" \ + --private-key "${LOCAL_PK}" \ + --broadcast -vvvv + +echo "Done. Anvil (PID ${ANVIL_PID}) will be stopped now." + diff --git a/the-guild-smart-contracts/script/FullDeploymentScript.s.sol b/the-guild-smart-contracts/script/FullDeploymentScript.s.sol index 1065d8a..a70bfb5 100644 --- a/the-guild-smart-contracts/script/FullDeploymentScript.s.sol +++ b/the-guild-smart-contracts/script/FullDeploymentScript.s.sol @@ -15,19 +15,22 @@ import {console} from "forge-std/console.sol"; contract FullDeploymentScript is Script { function run() public { EAS eas; - bytes32 salt = bytes32("theguild_v_0.1.1"); + bytes32 salt = bytes32("theguild_v_0.1.3"); // EAS addresses per https://github.com/ethereum-attestation-service/eas-contracts deployments // Base mainnet (8453) and Base Goerli/Sepolia (84531/84532) use the canonical predeploy 0x...21 // Optimism mainnet (10) and OP Sepolia (11155420) also use canonical 0x...21 eas = EAS(EASUtils.getEASAddress(vm)); - vm.startBroadcast(); + // Derive deployer EOA from PRIVATE_KEY to keep ownership consistent under CREATE2 factory + uint256 pk = vm.envUint("PRIVATE_KEY"); + address deployer = vm.addr(pk); + vm.startBroadcast(pk); - // Deploy activity token via CREATE2 + // Deploy activity token via CREATE2 with initial owner set to EOA (tx.origin) TheGuildActivityToken activityToken = new TheGuildActivityToken{ salt: salt - }(); + }(deployer); // Deploy or attach to existing badge registry via CREATE2 (needs to exist before resolver) TheGuildBadgeRegistry badgeRegistry = new TheGuildBadgeRegistry{ @@ -38,6 +41,7 @@ contract FullDeploymentScript is Script { TheGuildAttestationResolver resolver = new TheGuildAttestationResolver{ salt: salt }(eas, activityToken, badgeRegistry); + // Transfer ownership from EOA to resolver so it can mint on attest activityToken.transferOwnership(address(resolver)); // Register TheGuild Schema diff --git a/the-guild-smart-contracts/script/TheGuildAttestationResolver.s.sol b/the-guild-smart-contracts/script/TheGuildAttestationResolver.s.sol index 4612b54..0c902ab 100644 --- a/the-guild-smart-contracts/script/TheGuildAttestationResolver.s.sol +++ b/the-guild-smart-contracts/script/TheGuildAttestationResolver.s.sol @@ -17,8 +17,10 @@ contract TheGuildActivityTokenScript is Script { eas = EASUtils.getEASAddress(vm); - vm.startBroadcast(); - TheGuildActivityToken token = new TheGuildActivityToken(); + uint256 pk = vm.envUint("PRIVATE_KEY"); + address deployer = vm.addr(pk); + vm.startBroadcast(pk); + TheGuildActivityToken token = new TheGuildActivityToken(deployer); TheGuildBadgeRegistry badgeRegistry = new TheGuildBadgeRegistry(); TheGuildAttestationResolver resolver = new TheGuildAttestationResolver( IEAS(eas), diff --git a/the-guild-smart-contracts/src/TheGuildActivityToken.sol b/the-guild-smart-contracts/src/TheGuildActivityToken.sol index 7997df0..f5c64cb 100644 --- a/the-guild-smart-contracts/src/TheGuildActivityToken.sol +++ b/the-guild-smart-contracts/src/TheGuildActivityToken.sol @@ -7,7 +7,9 @@ import {Ownable} from "openzeppelin-contracts/contracts/access/Ownable.sol"; /// @title TheGuildActivityToken (TGA) /// @notice Pure ERC20 token; ownership is transferred to resolver to mint on attest. contract TheGuildActivityToken is ERC20, Ownable { - constructor() ERC20("TheGuildActivityToken", "TGA") Ownable(msg.sender) {} + constructor( + address initialOwner + ) ERC20("TheGuildActivityToken", "TGA") Ownable(initialOwner) {} /// @notice Mint tokens to a recipient. Only owner can mint. function mint(address to, uint256 amount) external onlyOwner { diff --git a/the-guild-smart-contracts/test/TheGuildActivityToken.t.sol b/the-guild-smart-contracts/test/TheGuildActivityToken.t.sol index 6476068..f430aae 100644 --- a/the-guild-smart-contracts/test/TheGuildActivityToken.t.sol +++ b/the-guild-smart-contracts/test/TheGuildActivityToken.t.sol @@ -11,7 +11,7 @@ contract TheGuildActivityTokenTest is Test { address private user = address(0xBEEF); function setUp() public { - token = new TheGuildActivityToken(); + token = new TheGuildActivityToken(owner); } function test_Metadata() public view { diff --git a/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol b/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol index 3ff736a..93bf719 100644 --- a/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol +++ b/the-guild-smart-contracts/test/TheGuildAttestationResolver.t.sol @@ -27,7 +27,7 @@ contract TheGuildAttestationResolverTest is Test { eas = new EAS(schemaRegistry); // Deploy token, registry & resolver and transfer ownership to resolver - token = new TheGuildActivityToken(); + token = new TheGuildActivityToken(address(this)); badgeRegistry = new TheGuildBadgeRegistry(); resolver = new TheGuildAttestationResolver( IEAS(address(eas)), @@ -79,7 +79,9 @@ contract TheGuildAttestationResolverTest is Test { function test_AttestWithoutOwnershipTransferWouldFail() public { // Fresh token not owned by resolver - TheGuildActivityToken tempToken = new TheGuildActivityToken(); + TheGuildActivityToken tempToken = new TheGuildActivityToken( + address(this) + ); TheGuildBadgeRegistry tempRegistry = new TheGuildBadgeRegistry(); TheGuildAttestationResolver tempResolver = new TheGuildAttestationResolver( IEAS(address(eas)), From 3d0f267bcb988d9b9eb47fdf42224c3daaa2cf56 Mon Sep 17 00:00:00 2001 From: Antoine Estienne Date: Tue, 4 Nov 2025 15:41:20 +0100 Subject: [PATCH 6/7] fix front end --- README.md | 30 ++++++++++++++++++- frontend/.env.example | 11 ------- frontend/README.md | 3 ++ frontend/env.example | 14 +++++++++ .../action-buttons/AddAttestationDialog.tsx | 1 + .../attestations/use-create-attestation.ts | 19 ++++++++---- .../attestations/use-get-attestations.ts | 17 ++++++----- ...yTokenAbi.ts => attestationResolverAbi.ts} | 4 +-- .../src/lib/constants/blockchainConstants.ts | 5 ++++ frontend/src/lib/utils/blockchainUtils.ts | 13 ++++++++ 10 files changed, 90 insertions(+), 27 deletions(-) delete mode 100644 frontend/.env.example create mode 100644 frontend/env.example rename frontend/src/lib/abis/{activityTokenAbi.ts => attestationResolverAbi.ts} (90%) diff --git a/README.md b/README.md index bb91836..2488338 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ PUBLIC_API_URL=http://localhost:3001 PUBLIC_BADGE_REGISTRY_ADDRESS=0x... PUBLIC_EAS_CONTRACT_ADDRESS=0x... PUBLIC_ACTIVITY_TOKEN_ADDRESS=0x... +PUBLIC_ATTESTATION_RESOLVER_ADDRESS=0x... PUBLIC_SCHEMA_ID=0x... # Discord Bot (if using) @@ -167,7 +168,7 @@ forge script script/TheGuildBadgeRegistry.s.sol:TheGuildBadgeRegistryScript --rp ## Smart Contracts -The `the-guild-smart-contracts/` directory contains our Solidity smart contracts built with Foundry. +The `the-guild-smart-contracts/` directory contains our Solidity smart contracts built with Foundry. See the dedicated docs for deployment details, addresses, and usage: [the-guild-smart-contracts/README.md](the-guild-smart-contracts/README.md). ### TheGuildBadgeRegistry @@ -203,6 +204,33 @@ function badgeNameAt(uint256 index) external view returns (bytes32) event BadgeCreated(bytes32 indexed name, bytes32 description, address indexed creator) ``` +### TheGuildActivityToken (TGA) + +An ERC20 token used to reward attestations. Ownable; the owner is the attestation resolver contract. + +**Key Points:** +- 18 decimals; symbol `TGA` +- Owner-only `mint(address to, uint256 amount)` + +### TheGuildAttestationResolver + +An EAS `SchemaResolver` that validates attestations and mints TGA on success. + +**Validation and Behavior:** +- Decodes schema data: `bytes32 badgeName, bytes justification` +- Requires `badgeName` to exist in `TheGuildBadgeRegistry` +- Prevents duplicate `(attester, recipient, badgeName)` via a keyed mapping +- Mints `10 * 10^decimals()` TGA to the attester on success + +### TheGuildBadgeRanking + +Simple community ranking via upvotes on badges. + +**Key Functions:** +- `upvoteBadge(bytes32 badgeName)` – One vote per address per badge +- `getUpvotes(bytes32 badgeName)` – Read total votes +- `hasVotedForBadge(bytes32 badgeName, address voter)` – Read if voted + ## Features ### V0 (Current) diff --git a/frontend/.env.example b/frontend/.env.example deleted file mode 100644 index 2f41630..0000000 --- a/frontend/.env.example +++ /dev/null @@ -1,11 +0,0 @@ -# WalletConnect Project ID -PUBLIC_WALLET_CONNECT_PROJECT_ID=your_project_id_here - -# Backend API URL -PUBLIC_API_URL=http://localhost:3001 - -# Contract addresses (values for amoy) -PUBLIC_BADGE_REGISTRY_ADDRESS=0xc142ab6b4688b7b81cb4cc8b305f517bba3bfd25 -PUBLIC_EAS_CONTRACT_ADDRESS=0xb101275a60d8bfb14529C421899aD7CA1Ae5B5Fc -PUBLIC_ACTIVITY_TOKEN_ADDRESS=0x5db978bc69e54250f577ed343273508baea136cd -PUBLIC_SCHEMA_ID=0xb167f07504166f717f2a2710dbcfbfdf8fad6e8c6128c1a7fa80768f61b1d0b2 diff --git a/frontend/README.md b/frontend/README.md index 54b1860..86d6da2 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -51,7 +51,10 @@ PUBLIC_WALLET_CONNECT_PROJECT_ID=your_wallet_connect_project_id PUBLIC_API_URL=http://localhost:3001 PUBLIC_BADGE_REGISTRY_ADDRESS=0x... PUBLIC_EAS_CONTRACT_ADDRESS=0x... +# ERC20 token used for balances/transfers PUBLIC_ACTIVITY_TOKEN_ADDRESS=0x... +# EAS resolver used to read attestation list +PUBLIC_ATTESTATION_RESOLVER_ADDRESS=0x... PUBLIC_SCHEMA_ID=0x... ``` diff --git a/frontend/env.example b/frontend/env.example new file mode 100644 index 0000000..8bc4e26 --- /dev/null +++ b/frontend/env.example @@ -0,0 +1,14 @@ +# WalletConnect Project ID +PUBLIC_WALLET_CONNECT_PROJECT_ID=your_project_id_here + +# Backend API URL +PUBLIC_API_URL=http://localhost:3001 + +# Contract addresses (values for amoy) +PUBLIC_BADGE_REGISTRY_ADDRESS=0x94f5F12BE60a338D263882a1A49E81ca8A0c30F4 +PUBLIC_EAS_CONTRACT_ADDRESS=0xb101275a60d8bfb14529C421899aD7CA1Ae5B5Fc +# ERC20 activity token (TGA) +PUBLIC_ACTIVITY_TOKEN_ADDRESS=0x4649490B118389d0Be8F48b8953eFb235d8CB545 +# EAS resolver used for attestation reads +PUBLIC_ATTESTATION_RESOLVER_ADDRESS=0x8B481fB56b133b590348B2B3B1D3Ae2fce0D4324 +PUBLIC_SCHEMA_ID=0xbcd7561083784f9b5a1c2b3ddb7aa9db263d43c58f7374cfa4875646824a47de diff --git a/frontend/src/components/profiles/action-buttons/AddAttestationDialog.tsx b/frontend/src/components/profiles/action-buttons/AddAttestationDialog.tsx index 188eac4..49a2597 100644 --- a/frontend/src/components/profiles/action-buttons/AddAttestationDialog.tsx +++ b/frontend/src/components/profiles/action-buttons/AddAttestationDialog.tsx @@ -76,6 +76,7 @@ export function AddAttestationDialog({ ); } catch (e) { const message = (e as Error)?.message || String(e); + console.log("message", message); const isRpcRevert = message.includes("Internal JSON-RPC error") || message.includes('Contract function "attest" reverted') || diff --git a/frontend/src/hooks/attestations/use-create-attestation.ts b/frontend/src/hooks/attestations/use-create-attestation.ts index 79a23c5..82d57f0 100644 --- a/frontend/src/hooks/attestations/use-create-attestation.ts +++ b/frontend/src/hooks/attestations/use-create-attestation.ts @@ -25,14 +25,23 @@ function stringToBytes32(value: string): `0x${string}` { return hex as `0x${string}`; } +function stringToBytes(value: string): `0x${string}` { + const encoder = new TextEncoder(); + const bytes = encoder.encode(value); + let hex = "0x"; + for (let i = 0; i < bytes.length; i++) + hex += bytes[i].toString(16).padStart(2, "0"); + return hex as `0x${string}`; +} + function encodeBadgeData( badgeName: `0x${string}`, - justification: `0x${string}` + justificationBytes: `0x${string}` ) { - // Encode according to schema: bytes32 badgeName, bytes32 justification + // Encode according to schema: bytes32 badgeName, bytes justification return encodeAbiParameters( - [{ type: "bytes32" }, { type: "bytes32" }], - [badgeName, justification] + [{ type: "bytes32" }, { type: "bytes" }], + [badgeName, justificationBytes] ); } @@ -62,7 +71,7 @@ export function useCreateAttestation() { isBusyRef.current = true; // Convert strings to bytes32 const badgeNameBytes = stringToBytes32(badgeName); - const justificationBytes = stringToBytes32(justification); + const justificationBytes = stringToBytes(justification); // Encode data according to schema const encodedData = encodeBadgeData(badgeNameBytes, justificationBytes); diff --git a/frontend/src/hooks/attestations/use-get-attestations.ts b/frontend/src/hooks/attestations/use-get-attestations.ts index 0938414..c4eb0a5 100644 --- a/frontend/src/hooks/attestations/use-get-attestations.ts +++ b/frontend/src/hooks/attestations/use-get-attestations.ts @@ -1,9 +1,9 @@ import { useMemo } from "react"; import { useReadContract, useReadContracts } from "wagmi"; import { decodeAbiParameters } from "viem"; -import { activityTokenAbi } from "@/lib/abis/activityTokenAbi"; -import { ACTIVITY_TOKEN_ADDRESS } from "@/lib/constants/blockchainConstants"; -import { bytes32ToString } from "@/lib/utils/blockchainUtils"; +import { attestationResolverAbi } from "@/lib/abis/attestationResolverAbi"; +import { ATTESTATION_RESOLVER_ADDRESS } from "@/lib/constants/blockchainConstants"; +import { bytes32ToString, bytesToString } from "@/lib/utils/blockchainUtils"; import type { AttestationItem } from "@/lib/types/attestation"; function tryDecodeBadgeData(data: `0x${string}` | null | undefined): { @@ -13,12 +13,12 @@ function tryDecodeBadgeData(data: `0x${string}` | null | undefined): { if (!data) return { badgeName: "", justification: "" }; try { const [nameBytes, justificationBytes] = decodeAbiParameters( - [{ type: "bytes32" }, { type: "bytes32" }], + [{ type: "bytes32" }, { type: "bytes" }], data ) as [`0x${string}`, `0x${string}`]; return { badgeName: bytes32ToString(nameBytes), - justification: bytes32ToString(justificationBytes), + justification: bytesToString(justificationBytes), }; } catch { return { badgeName: "", justification: "" }; @@ -31,10 +31,11 @@ export function useGetAttestations(): { error: Error | null; refetch: () => void; } { - const address = ACTIVITY_TOKEN_ADDRESS; + // Use resolver contract for attestation enumeration + const address = ATTESTATION_RESOLVER_ADDRESS; const countQuery = useReadContract({ - abi: activityTokenAbi, + abi: attestationResolverAbi, address, functionName: "getAttestationCount", query: { enabled: Boolean(address) }, @@ -46,7 +47,7 @@ export function useGetAttestations(): { () => count > 0 ? Array.from({ length: count }, (_, i) => ({ - abi: activityTokenAbi, + abi: attestationResolverAbi, address, functionName: "getAttestationAtIndex" as const, args: [BigInt(i)], diff --git a/frontend/src/lib/abis/activityTokenAbi.ts b/frontend/src/lib/abis/attestationResolverAbi.ts similarity index 90% rename from frontend/src/lib/abis/activityTokenAbi.ts rename to frontend/src/lib/abis/attestationResolverAbi.ts index 290986a..26561a2 100644 --- a/frontend/src/lib/abis/activityTokenAbi.ts +++ b/frontend/src/lib/abis/attestationResolverAbi.ts @@ -1,5 +1,5 @@ -// Minimal ABI fragments we need from TheGuildActivityToken / EAS -export const activityTokenAbi = [ +// Minimal ABI fragments we need from +export const attestationResolverAbi = [ { type: "function", name: "getAttestationCount", diff --git a/frontend/src/lib/constants/blockchainConstants.ts b/frontend/src/lib/constants/blockchainConstants.ts index 77abcc4..372b7dc 100644 --- a/frontend/src/lib/constants/blockchainConstants.ts +++ b/frontend/src/lib/constants/blockchainConstants.ts @@ -7,8 +7,13 @@ export const EAS_CONTRACT_ADDRESS = (import.meta.env export const SCHEMA_ID = (import.meta.env.PUBLIC_SCHEMA_ID || "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef") as `0x${string}`; +// ERC20 TGA token address (for balances/transfers) export const ACTIVITY_TOKEN_ADDRESS = (import.meta.env .PUBLIC_ACTIVITY_TOKEN_ADDRESS || "") as Address; +// EAS resolver contract that exposes attestation getters +export const ATTESTATION_RESOLVER_ADDRESS = (import.meta.env + .PUBLIC_ATTESTATION_RESOLVER_ADDRESS || "") as Address; + export const BADGE_REGISTRY_ADDRESS = (import.meta.env .PUBLIC_BADGE_REGISTRY_ADDRESS || "") as Address; diff --git a/frontend/src/lib/utils/blockchainUtils.ts b/frontend/src/lib/utils/blockchainUtils.ts index 069696f..eef4347 100644 --- a/frontend/src/lib/utils/blockchainUtils.ts +++ b/frontend/src/lib/utils/blockchainUtils.ts @@ -18,6 +18,19 @@ export function bytes32ToString(value: `0x${string}`): string { } } +export function bytesToString(value: `0x${string}`): string { + try { + const hex = value.startsWith("0x") ? value.slice(2) : value; + const arr = new Uint8Array(hex.length / 2); + for (let i = 0; i < arr.length; i++) { + arr[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16); + } + return new TextDecoder().decode(arr); + } catch (_e) { + return ""; + } +} + export function stringToBytes32(value: string): `0x${string}` { // Encode to utf8, pad/truncate to 32 bytes, return as hex const encoder = new TextEncoder(); From 2ac272b05b7e5bafd4ee5e7b292efe92b55c28db Mon Sep 17 00:00:00 2001 From: Antoine Estienne Date: Tue, 4 Nov 2025 15:46:09 +0100 Subject: [PATCH 7/7] update docker files --- .github/workflows/deploy-frontend.yml | 2 ++ frontend/Dockerfile | 2 ++ .../components/profiles/action-buttons/AddAttestationDialog.tsx | 1 - 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-frontend.yml b/.github/workflows/deploy-frontend.yml index 6e7f67a..981b562 100644 --- a/.github/workflows/deploy-frontend.yml +++ b/.github/workflows/deploy-frontend.yml @@ -53,6 +53,7 @@ jobs: PUBLIC_BADGE_REGISTRY_ADDRESS: ${{ secrets.PUBLIC_BADGE_REGISTRY_ADDRESS }} PUBLIC_EAS_CONTRACT_ADDRESS: ${{ secrets.PUBLIC_EAS_CONTRACT_ADDRESS }} PUBLIC_ACTIVITY_TOKEN_ADDRESS: ${{ secrets.PUBLIC_ACTIVITY_TOKEN_ADDRESS }} + PUBLIC_ATTESTATION_RESOLVER_ADDRESS: ${{ secrets.PUBLIC_ATTESTATION_RESOLVER_ADDRESS }} PUBLIC_SCHEMA_ID: ${{ secrets.PUBLIC_SCHEMA_ID }} run: | DOCKER_BUILDKIT=0 docker build \ @@ -65,6 +66,7 @@ jobs: --build-arg PUBLIC_EAS_CONTRACT_ADDRESS="${PUBLIC_EAS_CONTRACT_ADDRESS}" \ --build-arg PUBLIC_ACTIVITY_TOKEN_ADDRESS="${PUBLIC_ACTIVITY_TOKEN_ADDRESS}" \ --build-arg PUBLIC_SCHEMA_ID="${PUBLIC_SCHEMA_ID}" \ + --build-arg PUBLIC_ATTESTATION_RESOLVER_ADDRESS="${PUBLIC_ATTESTATION_RESOLVER_ADDRESS}" \ docker push registry.heroku.com/${HEROKU_FRONTEND_APP}/web if: steps.changes.outputs.frontend == 'true' diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 6d4196e..41588e7 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -10,6 +10,7 @@ ARG PUBLIC_API_URL ARG PUBLIC_BADGE_REGISTRY_ADDRESS ARG PUBLIC_EAS_CONTRACT_ADDRESS ARG PUBLIC_ACTIVITY_TOKEN_ADDRESS +ARG PUBLIC_ATTESTATION_RESOLVER_ADDRESS ARG PUBLIC_SCHEMA_ID # Expose them to the build environment @@ -18,6 +19,7 @@ ENV PUBLIC_WALLET_CONNECT_PROJECT_ID=$PUBLIC_WALLET_CONNECT_PROJECT_ID \ PUBLIC_BADGE_REGISTRY_ADDRESS=$PUBLIC_BADGE_REGISTRY_ADDRESS \ PUBLIC_EAS_CONTRACT_ADDRESS=$PUBLIC_EAS_CONTRACT_ADDRESS \ PUBLIC_ACTIVITY_TOKEN_ADDRESS=$PUBLIC_ACTIVITY_TOKEN_ADDRESS \ + PUBLIC_ATTESTATION_RESOLVER_ADDRESS=$PUBLIC_ATTESTATION_RESOLVER_ADDRESS \ PUBLIC_SCHEMA_ID=$PUBLIC_SCHEMA_ID RUN npm run build diff --git a/frontend/src/components/profiles/action-buttons/AddAttestationDialog.tsx b/frontend/src/components/profiles/action-buttons/AddAttestationDialog.tsx index 49a2597..188eac4 100644 --- a/frontend/src/components/profiles/action-buttons/AddAttestationDialog.tsx +++ b/frontend/src/components/profiles/action-buttons/AddAttestationDialog.tsx @@ -76,7 +76,6 @@ export function AddAttestationDialog({ ); } catch (e) { const message = (e as Error)?.message || String(e); - console.log("message", message); const isRpcRevert = message.includes("Internal JSON-RPC error") || message.includes('Contract function "attest" reverted') ||