@gearbox-protocol/sdk 16.5.0 → 16.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/dev/claimFromFaucet.js +4 -8
- package/dist/cjs/dev/createAnvilClient.js +35 -17
- package/dist/cjs/dev/index.js +1 -0
- package/dist/cjs/onchain/accounts/CreditAccountsServiceV310.js +1 -0
- package/dist/cjs/onchain/accounts/utils/midasUtils.js +7 -1
- package/dist/cjs/onchain/core/createAddressProvider.js +2 -5
- package/dist/esm/dev/claimFromFaucet.js +4 -8
- package/dist/esm/dev/createAnvilClient.js +36 -19
- package/dist/esm/dev/index.js +2 -2
- package/dist/esm/onchain/accounts/CreditAccountsServiceV310.js +1 -0
- package/dist/esm/onchain/accounts/utils/midasUtils.js +8 -2
- package/dist/esm/onchain/core/createAddressProvider.js +2 -5
- package/dist/types/dev/claimFromFaucet.d.ts +0 -1
- package/dist/types/dev/createAnvilClient.d.ts +10 -3
- package/dist/types/dev/index.d.ts +2 -2
- package/dist/types/onchain/accounts/utils/midasUtils.d.ts +2 -1
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@ const require_dev_abi = require("./abi.js");
|
|
|
5
5
|
let viem_actions = require("viem/actions");
|
|
6
6
|
//#region src/dev/claimFromFaucet.ts
|
|
7
7
|
async function claimFromFaucet(opts) {
|
|
8
|
-
const { sdk, publicClient, wallet, faucet, claimer, role, amount, logger, gasMultiplier = 10n
|
|
8
|
+
const { sdk, publicClient, wallet, faucet, claimer, role, amount, logger, gasMultiplier = 10n } = opts;
|
|
9
9
|
let amnt = "default amount";
|
|
10
10
|
let args;
|
|
11
11
|
if (Array.isArray(amount)) {
|
|
@@ -54,13 +54,9 @@ async function claimFromFaucet(opts) {
|
|
|
54
54
|
gas: gas * gasMultiplier
|
|
55
55
|
});
|
|
56
56
|
logger?.debug({ request }, "simulated claim tx request");
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const hash = await wallet.writeContract(request);
|
|
61
|
-
logger?.debug({ hash }, "claim tx hash");
|
|
62
|
-
receipt = await publicClient.waitForTransactionReceipt({ hash });
|
|
63
|
-
}
|
|
57
|
+
const hash = await wallet.writeContract(request);
|
|
58
|
+
logger?.debug({ hash }, "claim tx hash");
|
|
59
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash });
|
|
64
60
|
if (receipt.status === "reverted") throw new Error(`${usr} failed to claimed ${amnt} from faucet, tx: ${receipt.transactionHash}`);
|
|
65
61
|
logger?.debug(`${usr} claimed ${amnt} from faucet, tx: ${receipt.transactionHash}`);
|
|
66
62
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
let viem = require("viem");
|
|
3
|
+
let viem_utils = require("viem/utils");
|
|
4
|
+
let viem_actions = require("viem/actions");
|
|
3
5
|
//#region src/dev/createAnvilClient.ts
|
|
4
6
|
let dealModulePromise;
|
|
5
7
|
async function loadDeal() {
|
|
@@ -8,23 +10,27 @@ async function loadDeal() {
|
|
|
8
10
|
if (!mod) throw new Error("createAnvilClient: deal action requires the 'viem-deal' package; install it as a dependency");
|
|
9
11
|
return mod.deal;
|
|
10
12
|
}
|
|
13
|
+
function anvilActions(client) {
|
|
14
|
+
return {
|
|
15
|
+
anvilNodeInfo: () => anvilNodeInfo(client),
|
|
16
|
+
isAnvil: () => isAnvil(client),
|
|
17
|
+
evmMineDetailed: (timestamp) => evmMineDetailed(client, timestamp),
|
|
18
|
+
deal: async (params) => {
|
|
19
|
+
await (await loadDeal())(client, params);
|
|
20
|
+
},
|
|
21
|
+
writeContractSync: (parameters) => writeContractSync(client, parameters)
|
|
22
|
+
};
|
|
23
|
+
}
|
|
11
24
|
/**
|
|
12
25
|
* Extends an arbitrary viem `PublicClient` with anvil + wallet actions plus
|
|
13
26
|
* the SDK's bonus actions (`anvilNodeInfo`, `isAnvil`, `evmMineDetailed`,
|
|
14
|
-
* `deal`).
|
|
27
|
+
* `deal`, `writeContractSync`).
|
|
15
28
|
*
|
|
16
29
|
* Used to lift `sdk.client` into an `AnvilClient` shape on the fly when test
|
|
17
30
|
* RPCs (impersonateAccount, setBalance, setStorageAt, ...) are needed.
|
|
18
31
|
*/
|
|
19
32
|
function extendAnvilClient(client) {
|
|
20
|
-
return client.extend(() => ({ mode: "anvil" })).extend((0, viem.testActions)({ mode: "anvil" })).extend(viem.walletActions).extend((c) => (
|
|
21
|
-
anvilNodeInfo: () => anvilNodeInfo(c),
|
|
22
|
-
isAnvil: () => isAnvil(c),
|
|
23
|
-
evmMineDetailed: (timestamp) => evmMineDetailed(c, timestamp),
|
|
24
|
-
deal: async (params) => {
|
|
25
|
-
await (await loadDeal())(c, params);
|
|
26
|
-
}
|
|
27
|
-
}));
|
|
33
|
+
return client.extend(() => ({ mode: "anvil" })).extend((0, viem.testActions)({ mode: "anvil" })).extend(viem.walletActions).extend((c) => anvilActions(c));
|
|
28
34
|
}
|
|
29
35
|
function createAnvilClient({ chain, transport, cacheTime = 0, pollingInterval = 50 }) {
|
|
30
36
|
return (0, viem.createTestClient)({
|
|
@@ -33,14 +39,7 @@ function createAnvilClient({ chain, transport, cacheTime = 0, pollingInterval =
|
|
|
33
39
|
transport,
|
|
34
40
|
cacheTime,
|
|
35
41
|
pollingInterval
|
|
36
|
-
}).extend(viem.publicActions).extend(viem.walletActions).extend((c) => (
|
|
37
|
-
anvilNodeInfo: () => anvilNodeInfo(c),
|
|
38
|
-
isAnvil: () => isAnvil(c),
|
|
39
|
-
evmMineDetailed: (timestamp) => evmMineDetailed(c, timestamp),
|
|
40
|
-
deal: async (params) => {
|
|
41
|
-
await (await loadDeal())(c, params);
|
|
42
|
-
}
|
|
43
|
-
}));
|
|
42
|
+
}).extend(viem.publicActions).extend(viem.walletActions).extend((c) => anvilActions(c));
|
|
44
43
|
}
|
|
45
44
|
/**
|
|
46
45
|
* View action to detect if client is an anvil client
|
|
@@ -85,9 +84,28 @@ async function evmMineDetailed(client, timestamp) {
|
|
|
85
84
|
return;
|
|
86
85
|
}
|
|
87
86
|
}
|
|
87
|
+
/**
|
|
88
|
+
* Anvil-compatible `writeContractSync`: send via `writeContract` (Anvil
|
|
89
|
+
* supports `eth_sendTransaction` / `eth_sendRawTransaction`) then wait for
|
|
90
|
+
* the receipt. Viem's own action uses `eth_sendRawTransactionSync`, which
|
|
91
|
+
* Anvil does not implement.
|
|
92
|
+
*/
|
|
93
|
+
async function writeContractSync(client, parameters) {
|
|
94
|
+
const { throwOnReceiptRevert, pollingInterval, timeout, ...writeParams } = parameters;
|
|
95
|
+
const hash = await (0, viem_utils.getAction)(client, viem_actions.writeContract, "writeContract")(writeParams);
|
|
96
|
+
const receipt = await (0, viem_utils.getAction)(client, viem_actions.waitForTransactionReceipt, "waitForTransactionReceipt")({
|
|
97
|
+
checkReplacement: false,
|
|
98
|
+
hash,
|
|
99
|
+
pollingInterval,
|
|
100
|
+
timeout
|
|
101
|
+
});
|
|
102
|
+
if (throwOnReceiptRevert && receipt.status === "reverted") throw new viem.BaseError(`Transaction with hash "${receipt.transactionHash}" reverted.`, { name: "TransactionReceiptRevertedError" });
|
|
103
|
+
return receipt;
|
|
104
|
+
}
|
|
88
105
|
//#endregion
|
|
89
106
|
exports.anvilNodeInfo = anvilNodeInfo;
|
|
90
107
|
exports.createAnvilClient = createAnvilClient;
|
|
91
108
|
exports.evmMineDetailed = evmMineDetailed;
|
|
92
109
|
exports.extendAnvilClient = extendAnvilClient;
|
|
93
110
|
exports.isAnvil = isAnvil;
|
|
111
|
+
exports.writeContractSync = writeContractSync;
|
package/dist/cjs/dev/index.js
CHANGED
|
@@ -88,3 +88,4 @@ exports.setLTZero = require_dev_ltUtils.setLTZero;
|
|
|
88
88
|
exports.setLTs = require_dev_ltUtils.setLTs;
|
|
89
89
|
exports.unpauseMidasIssuanceVault = require_dev_midasUtils.unpauseMidasIssuanceVault;
|
|
90
90
|
exports.verifyTestnet = require_dev_verifyTestnet.verifyTestnet;
|
|
91
|
+
exports.writeContractSync = require_dev_createAnvilClient.writeContractSync;
|
|
@@ -213,6 +213,7 @@ var CreditAccountsServiceV310 = class extends require_onchain_base_SDKConstruct.
|
|
|
213
213
|
}),
|
|
214
214
|
...callsAfter ?? []
|
|
215
215
|
];
|
|
216
|
+
calls = await this.#prependMidasReceiveGreenlist(cm.address, calls);
|
|
216
217
|
calls = await this.prependPriceUpdates(cm.address, calls);
|
|
217
218
|
const tx = reopenCreditAccount ? cmSuite.multicallTx(reopenCreditAccount, calls, rwaOptions) : cmSuite.openCreditAccountTx(to, calls, referralCode, rwaOptions);
|
|
218
219
|
tx.value = ethAmount.toString(10);
|
|
@@ -4,6 +4,7 @@ let viem = require("viem");
|
|
|
4
4
|
//#region src/onchain/accounts/utils/midasUtils.ts
|
|
5
5
|
const ADAPTER_MIDAS_GATEWAY = "ADAPTER::MIDAS_GATEWAY";
|
|
6
6
|
const ADAPTER_MIDAS_ISSUANCE_VAULT = "ADAPTER::MIDAS_ISSUANCE_VAULT";
|
|
7
|
+
const MGLOBAL_MTOKEN = (0, viem.getAddress)("0x7433806912Eae67919e66aea853d46Fa0aef98A8");
|
|
7
8
|
/**
|
|
8
9
|
* Permissionless gateways have no greenlist and reject `receiveGreenlist`,
|
|
9
10
|
* see MidasMode in integrations-v3
|
|
@@ -27,7 +28,8 @@ const receiveGreenlistCallData = (0, viem.encodeFunctionData)({
|
|
|
27
28
|
*
|
|
28
29
|
* Returns `calls` unchanged when nothing has to be greenlisted: no issuance
|
|
29
30
|
* vault is called, its mToken has no gateway adapter on this credit manager,
|
|
30
|
-
* the gateway is permissionless,
|
|
31
|
+
* the gateway is permissionless, the call is already there, or the mToken is
|
|
32
|
+
* mGLOBAL (temporary: its gateway cannot grant the greenlist).
|
|
31
33
|
*/
|
|
32
34
|
async function prependMidasReceiveGreenlist(props) {
|
|
33
35
|
const { cm, client, calls, logger } = props;
|
|
@@ -37,6 +39,10 @@ async function prependMidasReceiveGreenlist(props) {
|
|
|
37
39
|
if (gatewayByMToken.size === 0 || calledVaults.length === 0) return calls;
|
|
38
40
|
const gateways = new require_onchain_utils_AddressMap.AddressMap();
|
|
39
41
|
for (const vault of calledVaults) {
|
|
42
|
+
if ((0, viem.isAddressEqual)(vault.mToken, MGLOBAL_MTOKEN)) {
|
|
43
|
+
logger?.debug(`midas: skipping receiveGreenlist for mGLOBAL ${vault.mToken}`);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
40
46
|
const gateway = gatewayByMToken.get(vault.mToken);
|
|
41
47
|
if (!gateway) logger?.debug(`midas: no gateway adapter for mToken ${vault.mToken} minted by ${vault.address} on ${cm.name}, cannot greenlist the credit account`);
|
|
42
48
|
else if (calls.some((call) => (0, viem.isAddressEqual)(call.target, gateway.address) && call.callData === receiveGreenlistCallData)) logger?.debug(`midas: gateway adapter ${gateway.address} already receives the greenlist`);
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_abi_iVersion = require("../../abi/iVersion.js");
|
|
3
|
-
|
|
3
|
+
require("../constants/address-provider.js");
|
|
4
4
|
const require_onchain_constants_versions = require("../constants/versions.js");
|
|
5
5
|
require("../constants/index.js");
|
|
6
6
|
const require_onchain_utils_hex = require("../utils/hex.js");
|
|
7
7
|
const require_onchain_core_AddressProviderV310Contract = require("./AddressProviderV310Contract.js");
|
|
8
8
|
//#region src/onchain/core/createAddressProvider.ts
|
|
9
|
-
const OVERRIDE_ADDRESSES = {
|
|
10
|
-
[require_onchain_constants_address_provider.AP_PRICE_FEED_COMPRESSOR]: { 311: "0x1fA2637B9fab0CD14290A7EE908DDc9688a15120" },
|
|
11
|
-
[require_onchain_constants_address_provider.AP_MARKET_COMPRESSOR]: { 311: "0x0C27F242f6e9F2A9AD3261bE6e439De3B948bcA2" }
|
|
12
|
-
} };
|
|
9
|
+
const OVERRIDE_ADDRESSES = {};
|
|
13
10
|
async function createAddressProvider(sdk, address) {
|
|
14
11
|
let v;
|
|
15
12
|
if (require_onchain_utils_hex.hexEq(address, "0xF7f0a609BfAb9a0A98786951ef10e5FE26cC1E38")) v = 310n;
|
|
@@ -4,7 +4,7 @@ import { iFaucetAbi } from "./abi.js";
|
|
|
4
4
|
import { readContract } from "viem/actions";
|
|
5
5
|
//#region src/dev/claimFromFaucet.ts
|
|
6
6
|
async function claimFromFaucet(opts) {
|
|
7
|
-
const { sdk, publicClient, wallet, faucet, claimer, role, amount, logger, gasMultiplier = 10n
|
|
7
|
+
const { sdk, publicClient, wallet, faucet, claimer, role, amount, logger, gasMultiplier = 10n } = opts;
|
|
8
8
|
let amnt = "default amount";
|
|
9
9
|
let args;
|
|
10
10
|
if (Array.isArray(amount)) {
|
|
@@ -53,13 +53,9 @@ async function claimFromFaucet(opts) {
|
|
|
53
53
|
gas: gas * gasMultiplier
|
|
54
54
|
});
|
|
55
55
|
logger?.debug({ request }, "simulated claim tx request");
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const hash = await wallet.writeContract(request);
|
|
60
|
-
logger?.debug({ hash }, "claim tx hash");
|
|
61
|
-
receipt = await publicClient.waitForTransactionReceipt({ hash });
|
|
62
|
-
}
|
|
56
|
+
const hash = await wallet.writeContract(request);
|
|
57
|
+
logger?.debug({ hash }, "claim tx hash");
|
|
58
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash });
|
|
63
59
|
if (receipt.status === "reverted") throw new Error(`${usr} failed to claimed ${amnt} from faucet, tx: ${receipt.transactionHash}`);
|
|
64
60
|
logger?.debug(`${usr} claimed ${amnt} from faucet, tx: ${receipt.transactionHash}`);
|
|
65
61
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { createTestClient, publicActions, testActions, toHex, walletActions } from "viem";
|
|
1
|
+
import { BaseError, createTestClient, publicActions, testActions, toHex, walletActions } from "viem";
|
|
2
|
+
import { getAction } from "viem/utils";
|
|
3
|
+
import { waitForTransactionReceipt, writeContract } from "viem/actions";
|
|
2
4
|
//#region src/dev/createAnvilClient.ts
|
|
3
5
|
let dealModulePromise;
|
|
4
6
|
async function loadDeal() {
|
|
@@ -7,23 +9,27 @@ async function loadDeal() {
|
|
|
7
9
|
if (!mod) throw new Error("createAnvilClient: deal action requires the 'viem-deal' package; install it as a dependency");
|
|
8
10
|
return mod.deal;
|
|
9
11
|
}
|
|
12
|
+
function anvilActions(client) {
|
|
13
|
+
return {
|
|
14
|
+
anvilNodeInfo: () => anvilNodeInfo(client),
|
|
15
|
+
isAnvil: () => isAnvil(client),
|
|
16
|
+
evmMineDetailed: (timestamp) => evmMineDetailed(client, timestamp),
|
|
17
|
+
deal: async (params) => {
|
|
18
|
+
await (await loadDeal())(client, params);
|
|
19
|
+
},
|
|
20
|
+
writeContractSync: (parameters) => writeContractSync(client, parameters)
|
|
21
|
+
};
|
|
22
|
+
}
|
|
10
23
|
/**
|
|
11
24
|
* Extends an arbitrary viem `PublicClient` with anvil + wallet actions plus
|
|
12
25
|
* the SDK's bonus actions (`anvilNodeInfo`, `isAnvil`, `evmMineDetailed`,
|
|
13
|
-
* `deal`).
|
|
26
|
+
* `deal`, `writeContractSync`).
|
|
14
27
|
*
|
|
15
28
|
* Used to lift `sdk.client` into an `AnvilClient` shape on the fly when test
|
|
16
29
|
* RPCs (impersonateAccount, setBalance, setStorageAt, ...) are needed.
|
|
17
30
|
*/
|
|
18
31
|
function extendAnvilClient(client) {
|
|
19
|
-
return client.extend(() => ({ mode: "anvil" })).extend(testActions({ mode: "anvil" })).extend(walletActions).extend((c) => (
|
|
20
|
-
anvilNodeInfo: () => anvilNodeInfo(c),
|
|
21
|
-
isAnvil: () => isAnvil(c),
|
|
22
|
-
evmMineDetailed: (timestamp) => evmMineDetailed(c, timestamp),
|
|
23
|
-
deal: async (params) => {
|
|
24
|
-
await (await loadDeal())(c, params);
|
|
25
|
-
}
|
|
26
|
-
}));
|
|
32
|
+
return client.extend(() => ({ mode: "anvil" })).extend(testActions({ mode: "anvil" })).extend(walletActions).extend((c) => anvilActions(c));
|
|
27
33
|
}
|
|
28
34
|
function createAnvilClient({ chain, transport, cacheTime = 0, pollingInterval = 50 }) {
|
|
29
35
|
return createTestClient({
|
|
@@ -32,14 +38,7 @@ function createAnvilClient({ chain, transport, cacheTime = 0, pollingInterval =
|
|
|
32
38
|
transport,
|
|
33
39
|
cacheTime,
|
|
34
40
|
pollingInterval
|
|
35
|
-
}).extend(publicActions).extend(walletActions).extend((c) => (
|
|
36
|
-
anvilNodeInfo: () => anvilNodeInfo(c),
|
|
37
|
-
isAnvil: () => isAnvil(c),
|
|
38
|
-
evmMineDetailed: (timestamp) => evmMineDetailed(c, timestamp),
|
|
39
|
-
deal: async (params) => {
|
|
40
|
-
await (await loadDeal())(c, params);
|
|
41
|
-
}
|
|
42
|
-
}));
|
|
41
|
+
}).extend(publicActions).extend(walletActions).extend((c) => anvilActions(c));
|
|
43
42
|
}
|
|
44
43
|
/**
|
|
45
44
|
* View action to detect if client is an anvil client
|
|
@@ -84,5 +83,23 @@ async function evmMineDetailed(client, timestamp) {
|
|
|
84
83
|
return;
|
|
85
84
|
}
|
|
86
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Anvil-compatible `writeContractSync`: send via `writeContract` (Anvil
|
|
88
|
+
* supports `eth_sendTransaction` / `eth_sendRawTransaction`) then wait for
|
|
89
|
+
* the receipt. Viem's own action uses `eth_sendRawTransactionSync`, which
|
|
90
|
+
* Anvil does not implement.
|
|
91
|
+
*/
|
|
92
|
+
async function writeContractSync(client, parameters) {
|
|
93
|
+
const { throwOnReceiptRevert, pollingInterval, timeout, ...writeParams } = parameters;
|
|
94
|
+
const hash = await getAction(client, writeContract, "writeContract")(writeParams);
|
|
95
|
+
const receipt = await getAction(client, waitForTransactionReceipt, "waitForTransactionReceipt")({
|
|
96
|
+
checkReplacement: false,
|
|
97
|
+
hash,
|
|
98
|
+
pollingInterval,
|
|
99
|
+
timeout
|
|
100
|
+
});
|
|
101
|
+
if (throwOnReceiptRevert && receipt.status === "reverted") throw new BaseError(`Transaction with hash "${receipt.transactionHash}" reverted.`, { name: "TransactionReceiptRevertedError" });
|
|
102
|
+
return receipt;
|
|
103
|
+
}
|
|
87
104
|
//#endregion
|
|
88
|
-
export { anvilNodeInfo, createAnvilClient, evmMineDetailed, extendAnvilClient, isAnvil };
|
|
105
|
+
export { anvilNodeInfo, createAnvilClient, evmMineDetailed, extendAnvilClient, isAnvil, writeContractSync };
|
package/dist/esm/dev/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { iDegenNftv2Abi, iFaucetAbi, iOnchainExecutionIdAbi, iOwnableAbi, iaclTraitAbi } from "./abi.js";
|
|
2
2
|
import { claimFromFaucet } from "./claimFromFaucet.js";
|
|
3
|
-
import { anvilNodeInfo, createAnvilClient, evmMineDetailed, extendAnvilClient, isAnvil } from "./createAnvilClient.js";
|
|
3
|
+
import { anvilNodeInfo, createAnvilClient, evmMineDetailed, extendAnvilClient, isAnvil, writeContractSync } from "./createAnvilClient.js";
|
|
4
4
|
import { createMinter } from "./mint/factory.js";
|
|
5
5
|
import "./mint/index.js";
|
|
6
6
|
import { AccountOpener, OpenTxRevertedError } from "./AccountOpener.js";
|
|
@@ -25,4 +25,4 @@ import { claimDSToken, claimDSTokens, enableDSTokenBackDating } from "./securiti
|
|
|
25
25
|
import "./types.js";
|
|
26
26
|
import { ONCHAIN_EXECUTION_ID_ADDRESS, verifyTestnet } from "./verifyTestnet.js";
|
|
27
27
|
import { makePendingWithdrawalsClaimable } from "./withdrawalUtils.js";
|
|
28
|
-
export { AccountOpener, Create2Deployer, DEFAULT_CREATE2_SALT, EthCallSpy, NoAvailableTransportsError, ONCHAIN_EXECUTION_ID_ADDRESS, OpenTxRevertedError, PUBLIC_CREATE2_FACTORY, RevolverTransport, SUPPORTED_RPC_PROVIDERS, SelectionStrategy, anvilNodeInfo, calcLiquidatableLTs, claimDSToken, claimDSTokens, claimFromFaucet, collectMidasGateways, collectMidasMTokens, createAnvilClient, createMinter, deployUsingPublicCreate2, detectChain, enableDSTokenBackDating, evmMineDetailed, extendAnvilClient, getAlchemyUrl, getAnkrUrl, getDrpcUrl, getErpcKey, getPublicCreate2Address, getRpcProviderUrl, getThirdWebUrl, greenlistMidasGateway, httpTransportOptionsSchema, iDegenNftv2Abi, iFaucetAbi, iOnchainExecutionIdAbi, iOwnableAbi, iaclTraitAbi, isAnvil, isDeployedUsingPublicCreate2, isOutOfSyncError, isRangeError, isRateLimitError, isTransientError, logSplitterTransport, makePendingWithdrawalsClaimable, migrateFaucet, providerConfigSchema, registerMidasInvestor, registerRWAInvestor, registerSecuritizeInvestor, replaceStorage, resilientTransport, resilientTransportOptionsSchema, revolverTransportConfigBaseSchema, revolverTransportConfigSchema, rpcProvidersSchema, setLTZero, setLTs, unpauseMidasIssuanceVault, verifyTestnet };
|
|
28
|
+
export { AccountOpener, Create2Deployer, DEFAULT_CREATE2_SALT, EthCallSpy, NoAvailableTransportsError, ONCHAIN_EXECUTION_ID_ADDRESS, OpenTxRevertedError, PUBLIC_CREATE2_FACTORY, RevolverTransport, SUPPORTED_RPC_PROVIDERS, SelectionStrategy, anvilNodeInfo, calcLiquidatableLTs, claimDSToken, claimDSTokens, claimFromFaucet, collectMidasGateways, collectMidasMTokens, createAnvilClient, createMinter, deployUsingPublicCreate2, detectChain, enableDSTokenBackDating, evmMineDetailed, extendAnvilClient, getAlchemyUrl, getAnkrUrl, getDrpcUrl, getErpcKey, getPublicCreate2Address, getRpcProviderUrl, getThirdWebUrl, greenlistMidasGateway, httpTransportOptionsSchema, iDegenNftv2Abi, iFaucetAbi, iOnchainExecutionIdAbi, iOwnableAbi, iaclTraitAbi, isAnvil, isDeployedUsingPublicCreate2, isOutOfSyncError, isRangeError, isRateLimitError, isTransientError, logSplitterTransport, makePendingWithdrawalsClaimable, migrateFaucet, providerConfigSchema, registerMidasInvestor, registerRWAInvestor, registerSecuritizeInvestor, replaceStorage, resilientTransport, resilientTransportOptionsSchema, revolverTransportConfigBaseSchema, revolverTransportConfigSchema, rpcProvidersSchema, setLTZero, setLTs, unpauseMidasIssuanceVault, verifyTestnet, writeContractSync };
|
|
@@ -212,6 +212,7 @@ var CreditAccountsServiceV310 = class extends SDKConstruct {
|
|
|
212
212
|
}),
|
|
213
213
|
...callsAfter ?? []
|
|
214
214
|
];
|
|
215
|
+
calls = await this.#prependMidasReceiveGreenlist(cm.address, calls);
|
|
215
216
|
calls = await this.prependPriceUpdates(cm.address, calls);
|
|
216
217
|
const tx = reopenCreditAccount ? cmSuite.multicallTx(reopenCreditAccount, calls, rwaOptions) : cmSuite.openCreditAccountTx(to, calls, referralCode, rwaOptions);
|
|
217
218
|
tx.value = ethAmount.toString(10);
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { AddressMap } from "../../utils/AddressMap.js";
|
|
2
|
-
import { encodeFunctionData, isAddressEqual, parseAbi } from "viem";
|
|
2
|
+
import { encodeFunctionData, getAddress, isAddressEqual, parseAbi } from "viem";
|
|
3
3
|
//#region src/onchain/accounts/utils/midasUtils.ts
|
|
4
4
|
const ADAPTER_MIDAS_GATEWAY = "ADAPTER::MIDAS_GATEWAY";
|
|
5
5
|
const ADAPTER_MIDAS_ISSUANCE_VAULT = "ADAPTER::MIDAS_ISSUANCE_VAULT";
|
|
6
|
+
const MGLOBAL_MTOKEN = getAddress("0x7433806912Eae67919e66aea853d46Fa0aef98A8");
|
|
6
7
|
/**
|
|
7
8
|
* Permissionless gateways have no greenlist and reject `receiveGreenlist`,
|
|
8
9
|
* see MidasMode in integrations-v3
|
|
@@ -26,7 +27,8 @@ const receiveGreenlistCallData = encodeFunctionData({
|
|
|
26
27
|
*
|
|
27
28
|
* Returns `calls` unchanged when nothing has to be greenlisted: no issuance
|
|
28
29
|
* vault is called, its mToken has no gateway adapter on this credit manager,
|
|
29
|
-
* the gateway is permissionless,
|
|
30
|
+
* the gateway is permissionless, the call is already there, or the mToken is
|
|
31
|
+
* mGLOBAL (temporary: its gateway cannot grant the greenlist).
|
|
30
32
|
*/
|
|
31
33
|
async function prependMidasReceiveGreenlist(props) {
|
|
32
34
|
const { cm, client, calls, logger } = props;
|
|
@@ -36,6 +38,10 @@ async function prependMidasReceiveGreenlist(props) {
|
|
|
36
38
|
if (gatewayByMToken.size === 0 || calledVaults.length === 0) return calls;
|
|
37
39
|
const gateways = new AddressMap();
|
|
38
40
|
for (const vault of calledVaults) {
|
|
41
|
+
if (isAddressEqual(vault.mToken, MGLOBAL_MTOKEN)) {
|
|
42
|
+
logger?.debug(`midas: skipping receiveGreenlist for mGLOBAL ${vault.mToken}`);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
39
45
|
const gateway = gatewayByMToken.get(vault.mToken);
|
|
40
46
|
if (!gateway) logger?.debug(`midas: no gateway adapter for mToken ${vault.mToken} minted by ${vault.address} on ${cm.name}, cannot greenlist the credit account`);
|
|
41
47
|
else if (calls.some((call) => isAddressEqual(call.target, gateway.address) && call.callData === receiveGreenlistCallData)) logger?.debug(`midas: gateway adapter ${gateway.address} already receives the greenlist`);
|
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import { iVersionAbi } from "../../abi/iVersion.js";
|
|
2
|
-
import
|
|
2
|
+
import "../constants/address-provider.js";
|
|
3
3
|
import { isV310 } from "../constants/versions.js";
|
|
4
4
|
import "../constants/index.js";
|
|
5
5
|
import { hexEq } from "../utils/hex.js";
|
|
6
6
|
import { AddressProviderV310Contract } from "./AddressProviderV310Contract.js";
|
|
7
7
|
//#region src/onchain/core/createAddressProvider.ts
|
|
8
|
-
const OVERRIDE_ADDRESSES = {
|
|
9
|
-
[AP_PRICE_FEED_COMPRESSOR]: { 311: "0x1fA2637B9fab0CD14290A7EE908DDc9688a15120" },
|
|
10
|
-
[AP_MARKET_COMPRESSOR]: { 311: "0x0C27F242f6e9F2A9AD3261bE6e439De3B948bcA2" }
|
|
11
|
-
} };
|
|
8
|
+
const OVERRIDE_ADDRESSES = {};
|
|
12
9
|
async function createAddressProvider(sdk, address) {
|
|
13
10
|
let v;
|
|
14
11
|
if (hexEq(address, "0xF7f0a609BfAb9a0A98786951ef10e5FE26cC1E38")) v = 310n;
|
|
@@ -24,7 +24,6 @@ interface ClaimFromFaucetOptions {
|
|
|
24
24
|
amount?: TokenClaim[] | bigint | ((minAmountUSD: bigint) => bigint);
|
|
25
25
|
gasMultiplier?: bigint;
|
|
26
26
|
logger?: ILogger;
|
|
27
|
-
sync?: boolean;
|
|
28
27
|
}
|
|
29
28
|
declare function claimFromFaucet(opts: ClaimFromFaucetOptions): Promise<void>;
|
|
30
29
|
//#endregion
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Account, Address, Block, Chain, Client, Hex, Prettify, PublicClient, TestActions, TestRpcSchema, Transport, WalletClient } from "viem";
|
|
1
|
+
import { Abi, Account, Address, Block, Chain, Client, ContractFunctionArgs, ContractFunctionName, Hex, Prettify, PublicClient, TestActions, TestRpcSchema, Transport, WalletClient, WriteContractSyncParameters, WriteContractSyncReturnType } from "viem";
|
|
2
2
|
//#region src/dev/createAnvilClient.d.ts
|
|
3
3
|
interface AnvilNodeInfo {
|
|
4
4
|
currentBlockNumber: string;
|
|
@@ -67,7 +67,7 @@ interface AnvilClientConfig<transport extends Transport = Transport, chain exten
|
|
|
67
67
|
/**
|
|
68
68
|
* Extends an arbitrary viem `PublicClient` with anvil + wallet actions plus
|
|
69
69
|
* the SDK's bonus actions (`anvilNodeInfo`, `isAnvil`, `evmMineDetailed`,
|
|
70
|
-
* `deal`).
|
|
70
|
+
* `deal`, `writeContractSync`).
|
|
71
71
|
*
|
|
72
72
|
* Used to lift `sdk.client` into an `AnvilClient` shape on the fly when test
|
|
73
73
|
* RPCs (impersonateAccount, setBalance, setStorageAt, ...) are needed.
|
|
@@ -93,5 +93,12 @@ declare function anvilNodeInfo(client: Client<any, any, any, AnvilRPCSchema, any
|
|
|
93
93
|
* @returns
|
|
94
94
|
*/
|
|
95
95
|
declare function evmMineDetailed(client: Client<any, any, any, AnvilRPCSchema, any>, timestamp: bigint | number): Promise<Block<Hex> | undefined>;
|
|
96
|
+
/**
|
|
97
|
+
* Anvil-compatible `writeContractSync`: send via `writeContract` (Anvil
|
|
98
|
+
* supports `eth_sendTransaction` / `eth_sendRawTransaction`) then wait for
|
|
99
|
+
* the receipt. Viem's own action uses `eth_sendRawTransactionSync`, which
|
|
100
|
+
* Anvil does not implement.
|
|
101
|
+
*/
|
|
102
|
+
declare function writeContractSync<chain extends Chain | undefined, account extends Account | undefined, const abi extends Abi | readonly unknown[], functionName extends ContractFunctionName<abi, "nonpayable" | "payable">, args extends ContractFunctionArgs<abi, "nonpayable" | "payable", functionName>, chainOverride extends Chain | undefined>(client: Client<Transport, chain, account>, parameters: WriteContractSyncParameters<abi, functionName, args, chain, account, chainOverride>): Promise<WriteContractSyncReturnType<chain>>;
|
|
96
103
|
//#endregion
|
|
97
|
-
export { AnvilActions, AnvilClient, AnvilClientConfig, AnvilDealParameters, AnvilNodeInfo, AnvilRPCSchema, anvilNodeInfo, createAnvilClient, evmMineDetailed, extendAnvilClient, isAnvil };
|
|
104
|
+
export { AnvilActions, AnvilClient, AnvilClientConfig, AnvilDealParameters, AnvilNodeInfo, AnvilRPCSchema, anvilNodeInfo, createAnvilClient, evmMineDetailed, extendAnvilClient, isAnvil, writeContractSync };
|
|
@@ -6,7 +6,7 @@ import { iDegenNftv2Abi, iFaucetAbi, iOnchainExecutionIdAbi, iOwnableAbi, iaclTr
|
|
|
6
6
|
import { calcLiquidatableLTs } from "./calcLiquidatableLTs.js";
|
|
7
7
|
import { claimFromFaucet } from "./claimFromFaucet.js";
|
|
8
8
|
import { Create2Deployer, Create2Parameters, DEFAULT_CREATE2_SALT, EnsureExistsUsingPublicCreate2ReturnType, GetCreate2AddressParameters, PUBLIC_CREATE2_FACTORY, deployUsingPublicCreate2, getPublicCreate2Address, isDeployedUsingPublicCreate2 } from "./create2.js";
|
|
9
|
-
import { AnvilActions, AnvilClient, AnvilClientConfig, AnvilDealParameters, AnvilNodeInfo, AnvilRPCSchema, anvilNodeInfo, createAnvilClient, evmMineDetailed, extendAnvilClient, isAnvil } from "./createAnvilClient.js";
|
|
9
|
+
import { AnvilActions, AnvilClient, AnvilClientConfig, AnvilDealParameters, AnvilNodeInfo, AnvilRPCSchema, anvilNodeInfo, createAnvilClient, evmMineDetailed, extendAnvilClient, isAnvil, writeContractSync } from "./createAnvilClient.js";
|
|
10
10
|
import { detectChain } from "./detectChain.js";
|
|
11
11
|
import { isOutOfSyncError } from "./isOutOfSyncError.js";
|
|
12
12
|
import { isRateLimitError } from "./isRateLimitError.js";
|
|
@@ -26,4 +26,4 @@ import { EnableDSTokenBackDatingProps, RestoreDSTokenBackDating, claimDSToken, c
|
|
|
26
26
|
import { httpTransportOptionsSchema } from "./transports.js";
|
|
27
27
|
import { ONCHAIN_EXECUTION_ID_ADDRESS, VerifyTestnetParams, verifyTestnet } from "./verifyTestnet.js";
|
|
28
28
|
import { MakePendingWithdrawalsClaimableOptions, makePendingWithdrawalsClaimable } from "./withdrawalUtils.js";
|
|
29
|
-
export { AccountOpener, AccountOpenerOptions, AnvilActions, AnvilClient, AnvilClientConfig, AnvilDealParameters, AnvilNodeInfo, AnvilRPCSchema, CheckMulticallFn, Create2Deployer, Create2Parameters, DEFAULT_CREATE2_SALT, DetectedCall, EnableDSTokenBackDatingProps, EnsureExistsUsingPublicCreate2ReturnType, EthCallMethod, EthCallRequest, EthCallSpy, GetCreate2AddressParameters, GreenlistMidasGatewayProps, IMinter, type LogSplitterTransportOptions, MakePendingWithdrawalsClaimableOptions, NoAvailableTransportsError, ONCHAIN_EXECUTION_ID_ADDRESS, OpenAccountHumanizedPreview, OpenAccountResult, OpenAccountsResult, OpenTxRevertedError, PUBLIC_CREATE2_FACTORY, PoolDepositResult, ProviderConfig, ProviderStatus, RWAKycFailure, RegisterMidasInvestorProps, RegisterRWAInvestorProps, RegisterRWAInvestorResult, RegisterSecuritizeInvestorProps, ReplaceStorageParams, ResilientTransportOptions, RestoreDSTokenBackDating, RestoreMidasIssuanceVaultPause, RevolverTransport, RevolverTransportConfig, RevolverTransportValue, RpcErrorResult, RpcProvider, RpcResponse, RpcSuccessResult, SUPPORTED_RPC_PROVIDERS, SelectionStrategy, TargetAccount, UnpauseMidasIssuanceVaultProps, VerifyTestnetParams, anvilNodeInfo, calcLiquidatableLTs, claimDSToken, claimDSTokens, claimFromFaucet, collectMidasGateways, collectMidasMTokens, createAnvilClient, createMinter, deployUsingPublicCreate2, detectChain, enableDSTokenBackDating, evmMineDetailed, extendAnvilClient, getAlchemyUrl, getAnkrUrl, getDrpcUrl, getErpcKey, getPublicCreate2Address, getRpcProviderUrl, getThirdWebUrl, greenlistMidasGateway, httpTransportOptionsSchema, iDegenNftv2Abi, iFaucetAbi, iOnchainExecutionIdAbi, iOwnableAbi, iaclTraitAbi, isAnvil, isDeployedUsingPublicCreate2, isOutOfSyncError, isRangeError, isRateLimitError, isTransientError, logSplitterTransport, makePendingWithdrawalsClaimable, migrateFaucet, providerConfigSchema, registerMidasInvestor, registerRWAInvestor, registerSecuritizeInvestor, replaceStorage, resilientTransport, resilientTransportOptionsSchema, revolverTransportConfigBaseSchema, revolverTransportConfigSchema, rpcProvidersSchema, setLTZero, setLTs, unpauseMidasIssuanceVault, verifyTestnet };
|
|
29
|
+
export { AccountOpener, AccountOpenerOptions, AnvilActions, AnvilClient, AnvilClientConfig, AnvilDealParameters, AnvilNodeInfo, AnvilRPCSchema, CheckMulticallFn, Create2Deployer, Create2Parameters, DEFAULT_CREATE2_SALT, DetectedCall, EnableDSTokenBackDatingProps, EnsureExistsUsingPublicCreate2ReturnType, EthCallMethod, EthCallRequest, EthCallSpy, GetCreate2AddressParameters, GreenlistMidasGatewayProps, IMinter, type LogSplitterTransportOptions, MakePendingWithdrawalsClaimableOptions, NoAvailableTransportsError, ONCHAIN_EXECUTION_ID_ADDRESS, OpenAccountHumanizedPreview, OpenAccountResult, OpenAccountsResult, OpenTxRevertedError, PUBLIC_CREATE2_FACTORY, PoolDepositResult, ProviderConfig, ProviderStatus, RWAKycFailure, RegisterMidasInvestorProps, RegisterRWAInvestorProps, RegisterRWAInvestorResult, RegisterSecuritizeInvestorProps, ReplaceStorageParams, ResilientTransportOptions, RestoreDSTokenBackDating, RestoreMidasIssuanceVaultPause, RevolverTransport, RevolverTransportConfig, RevolverTransportValue, RpcErrorResult, RpcProvider, RpcResponse, RpcSuccessResult, SUPPORTED_RPC_PROVIDERS, SelectionStrategy, TargetAccount, UnpauseMidasIssuanceVaultProps, VerifyTestnetParams, anvilNodeInfo, calcLiquidatableLTs, claimDSToken, claimDSTokens, claimFromFaucet, collectMidasGateways, collectMidasMTokens, createAnvilClient, createMinter, deployUsingPublicCreate2, detectChain, enableDSTokenBackDating, evmMineDetailed, extendAnvilClient, getAlchemyUrl, getAnkrUrl, getDrpcUrl, getErpcKey, getPublicCreate2Address, getRpcProviderUrl, getThirdWebUrl, greenlistMidasGateway, httpTransportOptionsSchema, iDegenNftv2Abi, iFaucetAbi, iOnchainExecutionIdAbi, iOwnableAbi, iaclTraitAbi, isAnvil, isDeployedUsingPublicCreate2, isOutOfSyncError, isRangeError, isRateLimitError, isTransientError, logSplitterTransport, makePendingWithdrawalsClaimable, migrateFaucet, providerConfigSchema, registerMidasInvestor, registerRWAInvestor, registerSecuritizeInvestor, replaceStorage, resilientTransport, resilientTransportOptionsSchema, revolverTransportConfigBaseSchema, revolverTransportConfigSchema, rpcProvidersSchema, setLTZero, setLTs, unpauseMidasIssuanceVault, verifyTestnet, writeContractSync };
|
|
@@ -31,7 +31,8 @@ interface PrependMidasReceiveGreenlistProps {
|
|
|
31
31
|
*
|
|
32
32
|
* Returns `calls` unchanged when nothing has to be greenlisted: no issuance
|
|
33
33
|
* vault is called, its mToken has no gateway adapter on this credit manager,
|
|
34
|
-
* the gateway is permissionless,
|
|
34
|
+
* the gateway is permissionless, the call is already there, or the mToken is
|
|
35
|
+
* mGLOBAL (temporary: its gateway cannot grant the greenlist).
|
|
35
36
|
*/
|
|
36
37
|
declare function prependMidasReceiveGreenlist(props: PrependMidasReceiveGreenlistProps): Promise<MultiCall[]>;
|
|
37
38
|
//#endregion
|