Skip to content

Commit e13f46d

Browse files
committed
Add value forwarder
1 parent 1432870 commit e13f46d

File tree

5 files changed

+76
-0
lines changed

5 files changed

+76
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ The following is a list of contracts that are deployed by this script.
163163
| ClawbackMetadata | 0x335411eAA9D63251f8c0867600Be4d0C190a3b1f |
164164
| PaymentCombiner | 0xfe0a269E288051B0815E05Fe192FC888118CB8a2 |
165165
| PaymentsFactory | 0xdC8dC7d7F0AAfbc5901DA779Ed5aab779F3E7c14 |
166+
| ValueForwarder | 0xABAAd93EeE2a569cF0632f39B10A9f5D734777ca |
166167
| SequencePaymentsSigner-dev | 0x498399DD85CAa29A42Af499f82b271f1629ba0D7 |
167168
| SequencePayments-dev | 0xDE280948Af8A9762B6984995C8c3c7F5AEB921Bf |
168169
| SequencePaymentsSigner-next | 0x51805F2d8719a833C28EAc68aE881B2Eb70c0330 |

scripts/deploy-contracts.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ 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 { ValueForwarder } from './factories/token_library/ValueForwarder'
3031
import {
3132
FactoryV1,
3233
GuestModuleV1,
@@ -314,6 +315,8 @@ export const deployContracts = async (config: Config): Promise<string | null> =>
314315

315316
prompt.start('Deploying Sequence Payments contracts\n')
316317

318+
const valueForwarder = await singletonDeployer.deploy('ValueForwarder', ValueForwarder, 0, txParams)
319+
317320
const paymentCombiner = await singletonDeployer.deploy('PaymentCombiner', PaymentCombiner, 0, txParams)
318321

319322
type PaymentsDeployment = {
@@ -507,6 +510,7 @@ export const deployContracts = async (config: Config): Promise<string | null> =>
507510
ClawbackMetadata: clawbackMetadata.address,
508511
PaymentCombiner: paymentCombiner.address,
509512
PaymentsFactory: paymentsFactory.address,
513+
ValueForwarder: valueForwarder.address,
510514
ERC1155PackFactory: erc1155PackFactory.address
511515
}
512516
for (const { env, signerAddr, paymentsAddr } of paymentsDeployments) {
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { ContractFactory, type ethers } from 'ethers'
2+
import type { VerificationRequest } from 'scripts/types'
3+
4+
const abi = [
5+
{
6+
type: 'function',
7+
name: 'forwardValue',
8+
inputs: [
9+
{ name: 'to', type: 'address', internalType: 'address' },
10+
{ name: 'value', type: 'uint256', internalType: 'uint256' }
11+
],
12+
outputs: [],
13+
stateMutability: 'payable'
14+
}
15+
]
16+
17+
export class ValueForwarder extends ContractFactory {
18+
constructor(signer?: ethers.Signer) {
19+
super(
20+
abi,
21+
'6080806040523460155761014f908161001b8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c6398f850f11461002757600080fd5b6040366003190112610114576004356001600160a01b038116810361011457600080808093602435905af13d1561010f573d67ffffffffffffffff81116100f95760405190601f8101601f19908116603f0116820167ffffffffffffffff8111838210176100f9576040528152600060203d92013e5b156100a457005b60405162461bcd60e51b815260206004820152602760248201527f56616c7565466f727761726465723a204661696c656420746f20666f72776172604482015266642076616c756560c81b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b61009d565b600080fdfea26469706673582212202706a11f313e042ccf1cd42b40b5f01308364a2290592fe4e14dce33175da1bf64736f6c634300081c0033',
22+
signer
23+
)
24+
}
25+
}
26+
27+
export const VALUEFORWARDER_VERIFICATION: Omit<VerificationRequest, 'waitForSuccess'> = {
28+
contractToVerify: 'test/mocks/ValueForwarder.sol:ValueForwarder',
29+
version: 'v0.8.28+commit.7893614a',
30+
licenceType: 'Apache-2.0',
31+
compilerInput: {
32+
language: 'Solidity',
33+
sources: {
34+
'test/mocks/ValueForwarder.sol': {
35+
content:
36+
"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.27;\n\n/// @title ValueForwarder\n/// @author Michael Standen\n/// @notice Forwarder for value\ncontract ValueForwarder {\n function forwardValue(address to, uint256 value) external payable {\n (bool success, ) = to.call{value: value}('');\n require(success, 'ValueForwarder: Failed to forward value');\n }\n}\n"
37+
}
38+
},
39+
settings: {
40+
remappings: [
41+
'@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/',
42+
'erc2470-libs/=lib/erc2470-libs/',
43+
'erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/',
44+
'forge-std/=lib/forge-std/src/',
45+
'halmos-cheatcodes/=lib/openzeppelin-contracts/lib/halmos-cheatcodes/src/',
46+
'openzeppelin-contracts/=lib/openzeppelin-contracts/'
47+
],
48+
optimizer: {
49+
enabled: true,
50+
runs: 200
51+
},
52+
metadata: {
53+
useLiteralContent: false,
54+
bytecodeHash: 'ipfs',
55+
appendCBOR: true
56+
},
57+
outputSelection: {
58+
'*': {
59+
'*': ['evm.bytecode', 'evm.deployedBytecode', 'devdoc', 'userdoc', 'metadata', 'abi']
60+
}
61+
},
62+
evmVersion: 'paris',
63+
viaIR: true,
64+
libraries: {}
65+
}
66+
}
67+
}

scripts/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export type ContractName =
4343
| 'ClawbackMetadata'
4444
| 'PaymentCombiner'
4545
| 'PaymentsFactory'
46+
| 'ValueForwarder'
4647
| `SequencePaymentsSigner-${SequenceEnvironment}`
4748
| `SequencePayments-${SequenceEnvironment}`
4849

scripts/verify-contracts.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { UpgradeableBeacon } from './factories/token_library/UpgradeableBeacon'
3535
// ERC721OperatorEnforcedFactory,
3636
// ERC721OPERATORENFORCEDFACTORY_VERIFICATION
3737
// } from './factories/token_library/immutable/ERC721OperatorEnforcedFactory'
38+
import { VALUEFORWARDER_VERIFICATION } from './factories/token_library/ValueForwarder'
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'
@@ -185,6 +186,8 @@ export const verifyContracts = async (config: Config, walletContextAddrs: Contra
185186

186187
prompt.start('Verifying Payments contracts\n')
187188

189+
await verifyContract(walletContextAddrs.ValueForwarder, { ...VALUEFORWARDER_VERIFICATION, waitForSuccess })
190+
188191
await verifyContract(walletContextAddrs.PaymentCombiner, { ...PAYMENTCOMBINER_VERIFICATION, waitForSuccess })
189192
// Verify the implementation
190193
if (provider && walletContextAddrs.PaymentCombiner) {

0 commit comments

Comments
 (0)