Skip to content

Commit 583856f

Browse files
committed
Add trails deployment info
1 parent 9228640 commit 583856f

File tree

6 files changed

+144
-0
lines changed

6 files changed

+144
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ The following is a list of contracts that are deployed by this script.
149149
| SequenceMarketV2 | 0xfdb42A198a932C8D3B506Ffa5e855bC4b348a712 |
150150
| SequenceMarketV1 | 0xB537a160472183f2150d42EB1c3DD6684A55f74c |
151151
| BatchPayableHelper | 0x6166c1952c54dEd6b070B4616797E61b6c48A117 |
152+
| TrailsMulticall3Router | 0xfa407ac8d5f9991d5e8fd896b0a65acba617717c |
152153
| ERC20ItemsFactory | 0x1063cBEe6b3Cd69B49f1B922A0D402f484b39855 |
153154
| ERC721ItemsFactory | 0xC6064FfBaDB0687Da29721C8EC02ACa71e735a3e |
154155
| ERC1155ItemsFactory | 0x7364fDEFe24385B2b3869504383c94cF083AcbD6 |

scripts/deploy-contracts.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ import { ERC1155OperatorEnforcedFactory } from './factories/token_library/immuta
2727
import { ERC721OperatorEnforcedFactory } from './factories/token_library/immutable/ERC721OperatorEnforcedFactory'
2828
import { PaymentCombiner } from './factories/token_library/PaymentCombiner'
2929
import { PaymentsFactory } from './factories/token_library/PaymentsFactory'
30+
import { TrailsMulticall3Router } from './factories/trails/TrailsMulticall3Router'
31+
import { TrailsWaletContextTxs } from './factories/trails/Walletv3'
3032
import {
3133
FactoryV1,
3234
GuestModuleV1,
@@ -375,6 +377,30 @@ export const deployContracts = async (config: Config): Promise<string | null> =>
375377
const batchPayableHelper = await singletonDeployer.deploy('BatchPayableHelper', BatchPayableHelper, 0, txParams)
376378
prompt.succeed('Deployed Market contracts\n')
377379

380+
// Trails
381+
382+
prompt.start('Deploying Trails contracts\n')
383+
const trailsMulticall3Router = await singletonDeployer.deploy('TrailsMulticall3Router', TrailsMulticall3Router, 0, txParams)
384+
for (const trailsWalletContextTx of TrailsWaletContextTxs) {
385+
let code = await signer.provider.getCode(trailsWalletContextTx.checkAddr)
386+
if (code === '0x') {
387+
const tx = await signer.sendTransaction({
388+
to: trailsWalletContextTx.to,
389+
data: trailsWalletContextTx.data,
390+
...txParams
391+
})
392+
await tx.wait()
393+
code = await signer.provider.getCode(trailsWalletContextTx.checkAddr)
394+
if (code === '0x') {
395+
throw new Error(`Trails ${trailsWalletContextTx.checkAddr} not deployed with tx ${tx.hash}`)
396+
}
397+
prompt.log(`Trails ${trailsWalletContextTx.checkAddr} deployed with tx ${tx.hash}\n`)
398+
} else {
399+
prompt.log(`Trails ${trailsWalletContextTx.checkAddr} already deployed\n`)
400+
}
401+
}
402+
prompt.succeed('Deployed Trails contracts\n')
403+
378404
// Contracts library
379405

380406
prompt.start('Deploying Library contracts\n')
@@ -494,6 +520,7 @@ export const deployContracts = async (config: Config): Promise<string | null> =>
494520
SequenceMarketV2: marketV2Address,
495521
SequenceMarketV1: marketV1.address,
496522
BatchPayableHelper: batchPayableHelper.address,
523+
TrailsMulticall3Router: trailsMulticall3Router.address,
497524
ERC20ItemsFactory: erc20ItemsFactory.address,
498525
ERC721ItemsFactory: erc721ItemsFactory.address,
499526
ERC1155ItemsFactory: erc1155ItemsFactory.address,
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { ContractFactory, type ethers } from 'ethers'
2+
import type { VerificationRequest } from 'scripts/types'
3+
4+
// https://github.com/0xsequence/trails-contracts/blob/f65d27efee0f766c68ee664453523e913addb6bf/broadcast/TrailsMulticall3Router.s.sol/8453/run-1752834875.json
5+
6+
export class TrailsMulticall3Router extends ContractFactory {
7+
constructor(signer?: ethers.Signer) {
8+
super(
9+
[],
10+
'60a060405234603257600e6040565b60146036565b6106f761005b823960805181818161024c015261065f01526106f790f35b603c565b60405190565b5f80fd5b73ca11bde05977b3631167028862be2a173976ca1160805256fe60806040526004361015610015575b366102dc57005b61001f5f3561003e565b806309c5eabe14610039576394b41e520361000e576102a7565b61020b565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f80fd5b909182601f830112156100985781359167ffffffffffffffff831161009357602001926001830284011161008e57565b61005a565b610056565b610052565b906020828203126100ce575f82013567ffffffffffffffff81116100c9576100c5920161005e565b9091565b61004e565b61004a565b5190565b60209181520190565b60200190565b151590565b6100f4906100e6565b9052565b5190565b60209181520190565b90825f9392825e0152565b601f801991011690565b61013961014260209361014793610130816100f8565b938480936100fc565b95869101610105565b610110565b0190565b61017691602060408201926101665f8201515f8501906100eb565b015190602081840391015261011a565b90565b906101839161014b565b90565b60200190565b906101a0610199836100d3565b80926100d7565b90816101b1602083028401946100e0565b925f915b8383106101c457505050505090565b909192939460206101e66101e083856001950387528951610179565b97610186565b93019301919392906101b5565b6102089160208201915f81840391015261018c565b90565b61023361022261021c36600461009d565b9061064d565b61022a610044565b918291826101f3565b0390f35b5f80fd5b5f91031261024557565b61004a565b7f000000000000000000000000000000000000000000000000000000000000000090565b60018060a01b031690565b6102829061026e565b90565b61028e90610279565b9052565b91906102a5905f60208501940190610285565b565b346102d7576102b736600461023b565b6102d36102c261024a565b6102ca610044565b91829182610292565b0390f35b610237565b5f80fd5b606090565b905090565b90825f939282370152565b9091826103058161030c936102e5565b80936102ea565b0190565b909161031b926102f5565b90565b634e487b7160e01b5f52604160045260245ffd5b9061033c90610110565b810190811067ffffffffffffffff82111761035657604052565b61031e565b9061036e610367610044565b9283610332565b565b67ffffffffffffffff811161038e5761038a602091610110565b0190565b61031e565b906103a56103a083610370565b61035b565b918252565b606090565b3d5f146103ca576103bf3d610393565b903d5f602084013e5b565b6103d26103aa565b906103c8565b60209181520190565b60207f6c65640000000000000000000000000000000000000000000000000000000000917f547261696c734d756c746963616c6c33526f757465723a2063616c6c206661695f8201520152565b61043b60236040926103d8565b610444816103e1565b0190565b61045d9060208101905f81830391015261042e565b90565b1561046757565b61046f610044565b62461bcd60e51b81528061048560048201610448565b0390fd5b67ffffffffffffffff81116104a15760208091020190565b61031e565b5f80fd5b5f80fd5b6104b7816100e6565b036104be57565b5f80fd5b905051906104cf826104ae565b565b5f80fd5b909291926104ea6104e582610370565b61035b565b938185526020850190828401116105065761050492610105565b565b6104d1565b9080601f8301121561052957816020610526935191016104d5565b90565b610052565b91909160408184031261058057610545604061035b565b92610552815f84016104c2565b5f850152602082015167ffffffffffffffff811161057b57610574920161050b565b6020830152565b6104aa565b6104a6565b92919061059961059482610489565b61035b565b93818552602080860192028101918383116105f05781905b8382106105bf575050505050565b815167ffffffffffffffff81116105eb576020916105e0878493870161052e565b8152019101906105b1565b610052565b61005a565b9080601f830112156106135781602061061093519101610585565b90565b610052565b90602082820312610648575f82015167ffffffffffffffff81116106435761064092016105f5565b90565b61004e565b61004a565b5f80916106be9361065c6102e0565b507f00000000000000000000000000000000000000000000000000000000000000009161069361068a610044565b92839283610310565b03915af46106a86106a26103af565b91610460565b60206106b3826100f8565b818301019101610618565b9056fea2646970667358221220c745fcc8228be456513438936d544aa0e26a493039a0820c210f2d0debf2cb2964736f6c634300081e0033',
11+
signer
12+
)
13+
}
14+
}
15+
16+
export const TRAILSMULTICALL3ROUTER_VERIFICATION: Omit<VerificationRequest, 'waitForSuccess'> = {
17+
contractToVerify: 'src/TrailsMulticall3Router.sol:TrailsMulticall3Router',
18+
version: 'v0.8.30+commit.73712a01',
19+
licenceType: 'Apache-2.0',
20+
compilerInput: {
21+
language: 'Solidity',
22+
sources: {
23+
'src/TrailsMulticall3Router.sol': {
24+
content:
25+
'// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {IMulticall3} from "forge-std/interfaces/IMulticall3.sol";\n\n/**\n * @title TrailsMulticall3Router\n * @author Shun Kakinoki\n * @notice A wrapper to execute multiple calls via DELEGATECALL to preserve the original msg.sender.\n * @dev This contract mimics the Multicall3 interface but executes sub-calls via DELEGATECALL\n * to ensure that for the sub-calls, msg.sender is the original caller of this contract.\n * This is useful for smart contract wallets (intent addresses) that need to control msg.sender.\n */\ncontract TrailsMulticall3Router {\n // -------------------------------------------------------------------------\n // Immutable Variables\n // -------------------------------------------------------------------------\n\n address public immutable multicall3 = 0xcA11bde05977b3631167028862bE2a173976CA11;\n\n // -------------------------------------------------------------------------\n // Functions\n // -------------------------------------------------------------------------\n\n /**\n * @notice Aggregates multiple calls in a single transaction.\n * @dev See the contract-level documentation for the logic on how the call is performed.\n * @param data The data to execute.\n * @return returnResults The result of the execution. (Expects the underlying data returned to be an array of IMulticall3.Result)\n */\n function execute(bytes calldata data)\n public\n payable\n returns (IMulticall3.Result[] memory returnResults)\n {\n (bool success, bytes memory returnData) = multicall3.delegatecall(data);\n require(success, "TrailsMulticall3Router: call failed");\n return abi.decode(returnData, (IMulticall3.Result[]));\n }\n\n // -------------------------------------------------------------------------\n // Receive ETH\n // -------------------------------------------------------------------------\n\n /// @notice Receive ETH\n receive() external payable {}\n}\n'
26+
},
27+
'lib/forge-std/src/interfaces/IMulticall3.sol': {
28+
content:
29+
'// SPDX-License-Identifier: MIT\npragma solidity >=0.6.2 <0.9.0;\n\npragma experimental ABIEncoderV2;\n\ninterface IMulticall3 {\n struct Call {\n address target;\n bytes callData;\n }\n\n struct Call3 {\n address target;\n bool allowFailure;\n bytes callData;\n }\n\n struct Call3Value {\n address target;\n bool allowFailure;\n uint256 value;\n bytes callData;\n }\n\n struct Result {\n bool success;\n bytes returnData;\n }\n\n function aggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes[] memory returnData);\n\n function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);\n\n function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);\n\n function blockAndAggregate(Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n\n function getBasefee() external view returns (uint256 basefee);\n\n function getBlockHash(uint256 blockNumber) external view returns (bytes32 blockHash);\n\n function getBlockNumber() external view returns (uint256 blockNumber);\n\n function getChainId() external view returns (uint256 chainid);\n\n function getCurrentBlockCoinbase() external view returns (address coinbase);\n\n function getCurrentBlockDifficulty() external view returns (uint256 difficulty);\n\n function getCurrentBlockGasLimit() external view returns (uint256 gaslimit);\n\n function getCurrentBlockTimestamp() external view returns (uint256 timestamp);\n\n function getEthBalance(address addr) external view returns (uint256 balance);\n\n function getLastBlockHash() external view returns (bytes32 blockHash);\n\n function tryAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (Result[] memory returnData);\n\n function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls)\n external\n payable\n returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData);\n}\n'
30+
}
31+
},
32+
settings: {
33+
remappings: [
34+
'@/=src/',
35+
'test/=test/',
36+
'@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/',
37+
'forge-std/=lib/forge-std/src/',
38+
'lifi-contracts/=lib/contracts/src/',
39+
'erc2470-libs/=lib/erc2470-libs/',
40+
'wallet-contracts-v3/=lib/wallet-contracts-v3/src/',
41+
'@eth-optimism/=lib/contracts/node_modules/@hop-protocol/sdk/node_modules/@eth-optimism/',
42+
'@memview-sol/=lib/evm-cctp-contracts/lib/memview-sol/',
43+
'@uniswap/=lib/contracts/node_modules/@uniswap/',
44+
'Permit2/=lib/contracts/lib/Permit2/',
45+
'celer-network/=lib/contracts/lib/sgn-v2-contracts/',
46+
'centre-tokens.git/=lib/evm-cctp-contracts/lib/centre-tokens.git/',
47+
'contracts/=lib/contracts/src/',
48+
'create3-factory/=lib/contracts/lib/create3-factory/',
49+
'ds-test/=lib/evm-cctp-contracts/lib/ds-test/src/',
50+
'erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/',
51+
'eth-gas-reporter/=lib/contracts/node_modules/eth-gas-reporter/',
52+
'evm-cctp-contracts/=lib/evm-cctp-contracts/',
53+
'forge-gas-snapshot/=lib/contracts/lib/Permit2/lib/forge-gas-snapshot/src/',
54+
'halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/',
55+
'lifi/=lib/contracts/src/',
56+
'memview-sol/=lib/evm-cctp-contracts/lib/memview-sol/contracts/',
57+
'openzeppelin-contracts/=lib/openzeppelin-contracts/',
58+
'openzeppelin/=lib/contracts/lib/openzeppelin-contracts/contracts/',
59+
'permit2/=lib/contracts/lib/Permit2/src/',
60+
'sgn-v2-contracts/=lib/contracts/lib/sgn-v2-contracts/contracts/',
61+
'solady/=lib/contracts/lib/solady/src/',
62+
'solmate/=lib/contracts/lib/solmate/src/'
63+
],
64+
optimizer: {
65+
enabled: false,
66+
runs: 200
67+
},
68+
metadata: {
69+
useLiteralContent: false,
70+
bytecodeHash: 'ipfs',
71+
appendCBOR: true
72+
},
73+
outputSelection: {
74+
'*': {
75+
'*': ['evm.bytecode', 'evm.deployedBytecode', 'devdoc', 'userdoc', 'metadata', 'abi']
76+
}
77+
},
78+
evmVersion: 'cancun',
79+
viaIR: true,
80+
libraries: {}
81+
}
82+
}
83+
}

scripts/factories/trails/Walletv3.ts

Lines changed: 22 additions & 0 deletions
Large diffs are not rendered by default.

scripts/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export type ContractName =
2929
| 'SequenceMarketV2'
3030
| 'SequenceMarketV1'
3131
| 'BatchPayableHelper'
32+
| 'TrailsMulticall3Router'
3233
| 'ERC20ItemsFactory'
3334
| 'ERC721ItemsFactory'
3435
| 'ERC1155ItemsFactory'

scripts/verify-contracts.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { UpgradeableBeacon, UPGRADEABLEBEACON_VERIFICATION } from './factories/t
3535
// ERC721OperatorEnforcedFactory,
3636
// ERC721OPERATORENFORCEDFACTORY_VERIFICATION
3737
// } from './factories/token_library/immutable/ERC721OperatorEnforcedFactory'
38+
import { TRAILSMULTICALL3ROUTER_VERIFICATION } from './factories/trails/TrailsMulticall3Router'
3839
import { FACTORY_V1_VERIFICATION } from './factories/v1/FactoryV1'
3940
import { GUEST_MODULE_V1_VERIFICATION } from './factories/v1/GuestModuleV1'
4041
import { MAIN_MODULE_UPGRADABLE_V1_VERIFICATION } from './factories/v1/MainModuleUpgradableV1'
@@ -264,6 +265,15 @@ export const verifyContracts = async (config: Config, walletContextAddrs: Contra
264265
})
265266
prompt.succeed('Verified Market contracts\n')
266267

268+
// Trails
269+
270+
prompt.start('Verifying Trails contracts\n')
271+
await verifyContract(walletContextAddrs.TrailsMulticall3Router, {
272+
...TRAILSMULTICALL3ROUTER_VERIFICATION,
273+
waitForSuccess
274+
})
275+
prompt.succeed('Verified Trails contracts\n')
276+
267277
// Library contracts
268278

269279
prompt.start('Verifying Library contracts\n')

0 commit comments

Comments
 (0)